2013-07-21 2 views
2

최근에 WCF SOAP 서비스를 REST/JSON 서비스로 변환했습니다. 응답 here에 설명 된대로 Visual Studio의 서비스 참조 추가 기능은 JSON 서비스 용 코드를 생성 할 수 없습니다. 이 질문의 답에서 링크 된 기사는 문제를 해결하기 위해 WCF가 REST와 SOAP로 노출 될 가능성을 암시하지만 그렇게하는 방법에 대해서는 자세히 설명하지 않습니다.JSON 및 SOAP WCF 서비스?

이것이 가능한지 아는 사람이 있습니까? 그렇다면 설정하는 방법은 무엇입니까?

WCF REST 서비스의 WSDL을 읽고 C# 클래스를 생성하는 코드 생성기를 직접 작성하는 대안은 있지만 항상 이보다 쉬운 해결책이있는 것처럼 보입니다. 참고로

, 내 Web.config의 :

<system.serviceModel> 
<behaviors> 
    <endpointBehaviors> 
    <behavior name="RestBehavior"> 
     <webHttp /> 
    </behavior> 
    </endpointBehaviors> 
    <serviceBehaviors> 
    <behavior name="GetBehavior" > 
     <serviceMetadata httpGetEnabled="true" /> 
     <serviceDebug 
     httpHelpPageEnabled="true" 
     includeExceptionDetailInFaults="true" 
     /> 
    </behavior> 
    </serviceBehaviors> 
</behaviors> 
<bindings> 
    <webHttpBinding> 
    <binding name="WebHttpBinding"> 
     <security mode="TransportCredentialOnly"> 
     <transport clientCredentialType="None" /> 
     </security> 
    </binding> 
    </webHttpBinding> 
</bindings> 
<services> 
    <service name="Service" behaviorConfiguration="GetBehavior"> 
    <endpoint address="" 
     binding="webHttpBinding" 
     behaviorConfiguration="RestBehavior" 
     contract="IService" 
     bindingConfiguration="WebHttpBinding"> 
    </endpoint> 
    </service> 
</services> 
</system.serviceModel> 

내 서비스 메소드 모두가 다음과 같은 속성 : 지금까지 내가 당신이 JSON과 XML을 결합하기위한 세 가지 옵션이 알고

[WebInvoke(RequestFormat = WebMessageFormat.Json, ResponseFormat = WebMessageFormat.Json, BodyStyle = WebMessageBodyStyle.Wrapped)] 
+0

클라이언트와 서비스 솔루션이 동일한 'Models'프로젝트를 공유 할 수 있습니까? ? (모델 == DataContracts) – lcryder

답변

0

WCF의 응답은 바람직하지 않습니다.

  1. 특정 방법을 쓰십시오 (및 enpo ints)를 사용하여 XML 및 JSON을 적절히 꾸미고 그에 맞게 꾸밀 수 있습니다.
  2. serialization engine에 후크하고 HTTP 요청의 accept 헤더를 검사하여이를 결합합니다.
  3. 귀하의 방법을 수락하고 Streamwhich by convention tells WCF to give you direct access to the request and response streams을 반환하십시오.

각각의 방법은 그것의 자신의 결함이 있습니다 직렬화가 HTTP 헤더를 사용하여 결정해야하기 때문에 이것은, 추한 및 나머지의 사상에 위배되는 1. (자원을 식별한다)이 아닌 URL. 2. 직렬화 엔진에 연결하는 것은 복잡하며 일련 화를 결정하려면 헤더를 조사해야합니다. 3. 요청 매개 변수 매핑에 도움이되지 않으며 직렬화로 인해 메서드 본문이 복잡해진다.

나는 방법 3을 여러 번 사용했는데, 시작하기가 쉽고 간단하기 때문에 방법 2가 더 정확하다고 생각됩니다.

2

두 개의 끝점을 만들 필요가 있습니다. 하나는 비누 용이고 다른 하나는 json 용입니다. 내 프로젝트에서 그 짓을하고 SoapUI 또는 피들러 (JSON)를 통해 동시에 서비스에 액세스 할 수 있습니다, 여기에 예를 들어 설정입니다 :

<system.serviceModel> 
<behaviors> 
    <serviceBehaviors> 
    <behavior name="BehaviourService"> 
    <serviceMetadata httpGetEnabled="true" /> 
    <serviceDebug includeExceptionDetailInFaults="false" /> 
    </behavior> 
    </serviceBehaviors> 
    <endpointBehaviors> 
     <behavior name="BehaviourWebHttp"> 
     <webHttp defaultBodyStyle="Wrapped" automaticFormatSelectionEnabled="True" faultExceptionEnabled="True" /> 
     </behavior> 
    </endpointBehaviors> 
</behaviors> 

<services> 
    <service name="NameSpace.MyService" behaviorConfiguration="BehaviourService" > 
    <endpoint address ="soap" binding="basicHttpBinding" contract="NameSpace.IMyService"></endpoint> 
    <endpoint binding="webHttpBinding" behaviorConfiguration="BehaviourWebHttp" contract="NameSpace.IMyService" ></endpoint> 
    <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/> 
    <host> 
     <baseAddresses> 
     <add baseAddress="http://localhost:7689/MyService.svc"/> 
     </baseAddresses> 
    </host> 
    </service> 
</services> 
<serviceHostingEnvironment multipleSiteBindingsEnabled="true" /> 
</system.serviceModel> 

당신의 계약처럼 또한합니다 다음

[OperationContract] 
[WebInvoke(BodyStyle = WebMessageBodyStyle.Wrapped, UriTemplate = "MyMethod", Method = "POST")] 
bool MyMethod(); 

"localhost : 7689/MyService.svc/MyMethod"를 통해 "localhost : 7689/MyService.svc? wsdl"및 JSON을 통해 SOAP를받을 수 있습니다.