2010-07-20 4 views
4

HTTP Get 메서드에 응답하기 위해 WebGet 특성으로 구성된 다른 서버에 안정된 WCF 서비스가 있습니다. 나는 브라우저를 통해 직접 서비스를 호출하고 수동으로 Fiddler로 Get하고 올바른 응답을받을 수 있기 때문에 서비스가 올바르게 작동하는 것을 안다.WebGet 특성이 지정되어 있어도 WebGet 특성이 지정되어 있어도 게시를 사용하는 WCF 프록시 - 원인 405 오류

프록시 인터페이스 'IProductService':

using System.ServiceModel; 
using System.ServiceModel.Web; 

namespace Hugo.Infrastructure.Services.Products 
{ 
    [ServiceContract] 
    [XmlSerializerFormat] 
    public interface IProductService 
    { 
     [OperationContract(Name = "GetProductById")] 
     [WebGet(UriTemplate = "Products/Titles/{id}", 
      ResponseFormat = WebMessageFormat.Xml, 
      RequestFormat = WebMessageFormat.Xml, 
      BodyStyle = WebMessageBodyStyle.Bare)] 
     TitleDto GetTitleById(string id); 
    } 
} 

구현 'ProductService'

다음 코드와이 서비스를 호출 내 로컬 컴퓨터 상에 Asp.NET 프로젝트가
using System.ServiceModel; 

namespace Hugo.Infrastructure.Services.Products 
{ 
    public class ProductService : ClientBase<IProductService>, IProductService 
    { 
     public TitleDto GetTitleById(string id) 
     { 
      return Channel.GetTitleById(id); 
     } 
    } 
} 

관련 웹 구성 섹션 :

<system.serviceModel> 
    <serviceHostingEnvironment aspNetCompatibilityEnabled="true"> 
     <baseAddressPrefixFilters> 
     </baseAddressPrefixFilters>  
    </serviceHostingEnvironment> 
    ... 
    <client> 
     <endpoint address="http://server/directory/product.svc" bindingConfiguration="ProductServiceBinding" binding="webHttpBinding" behaviorConfiguration="productService" contract="Project.Infrastructure.Services.Products.IProductService" name="ProductServiceRest" /> 
    </client> 
    <behaviors> 
     ... 
     <endpointBehaviors> 
      <behavior name="productService"> 
       <webHttp /> 
      </behavior> 
      ... 
     </endpointBehaviors> 
    </behaviors> 
</system.serviceModel> 

이 방법은 프로젝트 내의 페이지에서 메서드를 호출 할 때 제대로 작동하지만 동일한 프로젝트의 WCF 서비스 내에서이 메서드를 호출 할 때이 라인에서 오류가 발생합니다 (return Channel.GetTitleById(id);). Google에서받는 오류는 HTTP 405 '허용되지 않는 메소드'오류입니다. 원격 서버의 IIS 로그를 살펴보면 메서드 호출이 페이지에서 시작될 때 ProductService 프록시가 HTTP GET 요청을하고 있지만 메서드가 WCF 서비스에서 호출 될 때 HTTP POST 요청을하고 있음을 알 수 있습니다. POST 메소드가 서비스에서 구성되지 않았으므로 405 오류가 발생합니다.

페이지와 서비스가 같은 폴더와 네임 스페이스에있는 경우에도 서비스에서 계속 동일한 오류가 발생합니다. 대신 고전적인 asmx soap 서비스를 사용하면 GET 호출이 이루어지고 서비스가 올바르게 실행되고 응답합니다. 우리가 수동으로 System.Net.WebRequest 개체를 사용하여 WCF 서비스에서 얻을 경우 서비스 호출이 성공합니다.

결론 WCF 클라이언트 프록시는 다른 WCF Rest 서비스에서 사용할 때 GET 대신 POST를 시도하지만 페이지 또는 다른 곳에서 사용하면 제대로 작동합니다.

도와주세요.

답변

6
+6

WCF는 것이 좋습니다. 왜 그렇게 많이 빨아 먹죠? – Brett

+0

@Brett : Microsoft 기술은 안정화되기까지 약 10 년이 걸립니다. 어째서 프로그래머의 품질이나 프레임 워크의 복잡성인지는 알 수 없습니다. –

+3

디자이너 중심의 드래그 앤 드롭 개발자를위한 마이크로 소프트의 욕구는 필연적 인 재작 성까지 계속 남아있는 부끄럽고 부끄러운 기술의 클러스터 크래프트로 끝나는 격렬한 나쁜 관행과 결합됩니다. 첨단 부채가 발생했다. – mythz

관련 문제