2010-03-18 3 views
25

타사 개발자가 우리 소프트웨어에 연결할 수 있도록 WCF를 사용하여 일반 웹 서비스 인터페이스를 구축하려고합니다. 많은 어려움과 읽기 (this question 많은 도움이 됨)를 마침내 SOAP, JSON 및 XML (POX)이 함께 작동했습니다. UriTemplate을 사용하여 WCF에서 SOAP/JSON/XML을 결합했습니다.

여기 내 코드입니다, 단순화하기 (I는 인터페이스를 사용하지 않는,이 예를 간단하게하는 -이 두 가지를 시도했다) :

<ServiceContract()> _ 
Public Class TestService 
    Public Sub New() 
    End Sub 

    <OperationContract()> _ 
    <WebGet()> _ 
    Public Function GetDate() As DateTime 
     Return Now 
    End Function 


    '<WebGet(UriTemplate:="getdateoffset/{numDays}")> _ 
    <OperationContract()> _ 
    Public Function GetDateOffset(ByVal numDays As Integer) As DateTime 
     Return Now.AddDays(numDays) 
    End Function 

End Class 

와의 Web.config 코드 :

<services> 
    <service name="TestService" 
      behaviorConfiguration="TestServiceBehavior"> 
    <endpoint address="soap" binding="basicHttpBinding" contract="TestService"/> 
    <endpoint address="json" binding="webHttpBinding" behaviorConfiguration="jsonBehavior" contract="TestService"/> 
    <endpoint address="xml" binding="webHttpBinding" behaviorConfiguration="poxBehavior" contract="TestService"/> 
    <endpoint address="mex" contract="IMetadataExchange" binding="mexHttpBinding" /> 
    </service> 
</services> 
<behaviors> 
    <endpointBehaviors> 
    <behavior name="jsonBehavior"> 
     <enableWebScript/> 
    </behavior> 
    <behavior name="poxBehavior"> 
     <webHttp /> 
    </behavior> 
    </endpointBehaviors> 
    <serviceBehaviors> 
    <behavior name="TestServiceBehavior"> 
     <serviceMetadata httpGetEnabled="true"/> 
     <serviceDebug includeExceptionDetailInFaults="false"/> 
    </behavior> 
    </serviceBehaviors> 
</behaviors> 

이것은 실제로 작동합니다. xml은 TestService.svc/xml/GetDate, json은 TestService.svc/json/GetDate, SOAP 클라이언트는 TestService.svc?wsdl이고 SOAP 쿼리가 작동합니다.

수정하고 싶은 부분은 쿼리입니다. TestService.svc/xml/GetDateOffset/4 대신 TestService.svc/xml/GetDateOffset?numDays=4을 사용해야합니다.

Endpoints using 'UriTemplate' cannot be used with 'System.ServiceModel.Description.WebScriptEnablingBehavior'.

그러나 <enableWebScript/>를 사용하지 않고 물론

는, JSON이 작동하지 않습니다 나는 UriTemplate을 지정하면, 나는 오류가 발생합니다.

제가 생각했던 것 외에 다른 3 가지 서비스 (.svc 파일)가 있습니다. 모두 계약을 지정하는 인터페이스를 구현하지만 클래스는 각각 다른 WebGet/WebInvoke 특성을 지정합니다. 수업. 이것은 많은 추가 작업처럼 보입니다. 솔직히 프레임 워크가 왜 나를 위해 처리하지 않는지 나는 알지 못합니다. 클래스의 구현은 속성을 제외하고는 모두 동일합니다. 즉, 시간이 지남에 따라 버그/변경이 한 구현에서는 고정/완료되고 JSON과 비교할 때 일관성없는 동작으로 이어지게됩니다. 예를 들어 SOAP 구현.

여기 뭔가 잘못 되었나요? WCF를 완전히 오용하고 잘못 사용하고 있습니까? 이 작업을 수행하는 더 좋은 방법이 있습니까?

내 경험으로 웹 물건을 다룰 때 일부 종류의 프레임 워크를 처리 할 수 ​​있어야한다고 생각합니다 ... 나는 그것을 구축하는 방법에 대한 내 머리 속에 아이디어가 있습니다. WCF가이 일을하기로되어있는 것 같아요. 그리고 저는 정말로 바퀴를 다시 만들고 싶지 않습니다.

+0

여기의 코드 예제는 매우 유용했습니다! 나는 JSON 바인딩을 가지고 있었고 .net 응용 프로그램에서 서비스를 사용할 수 없다는 것을 알았습니다. :) – Shawson

+0

[ASP.NET 웹 API] (http://www.asp.net/web-api)에서 이제는 완전히 폐기 된 것으로 간주됩니다. 이 질문의 원인이 된 코드는 오랫동안 웹 API를 사용하여 다시 작성되었습니다. 나는 당신이 [어두운 시대에 머물면서 SOAP을 정말로 필요로하지 않는] W5C를 사용하지 말 것을 강력히 권합니다. (http://stackoverflow.com/questions/11317572/asp-net-webapi-soap). – gregmac

답변

27

"순수한"JSON 지원에 실제로 <enableWebScript />이 아니며이 아닙니다. WebScriptEnablingBehavior은 ASP.NET AJAX를 지원하려는 경우에만 필요합니다. 더 자주는 아니지만 표준 스크립트 라이브러리로 작업하려는 경우 을 입력하지 마십시오.이 서비스에 대해이 지원을 사용하려고합니다.

대신 JSON 끝점에 대해 수행하려는 작업은 WebHttpBehavior을 사용하고 DefaultOutgoingResponseFormat = "JSON"으로 설정하면됩니다. 문제는 .NET 3.5에서 WebHttpElement이 구성을 위해 이러한 속성을 노출하지 않기 때문에 config를 통해이 설정을 제어 할 수 없다는 것입니다. 3.5에서이 문제를 해결하기 위해 다른 StackOverflow 질문에 EnhancedWebHttpElementhere in this answer라고하는 구현을 제공했습니다.

운좋게 Microsoft는이 단점을 인식하고 WebHttpElement in 4.0을 통해 모든 WebHttpBehavior 설정을 구성 할 수있었습니다.

4

드류 (Drew)의 대답은 그 자리에 있지만 나는 여전히 그 의문점이 있다고 생각한다.AJAX를위한 JSON과 UriTemplate의 축복을위한 정상적인 방법이 있습니까?

반환 된 JSON이 [WebGet (ResponseFormat = WebMessageFormat.Json)]을 통해 생성 된 JSON과 다르다고 언급 할 가치가 있다고 생각합니다. 전자는 MS AJAX 'd'요소를 감싸고있다. {"디":[{...}]}.

0

조작 중에 정수 매개 변수를 지정했습니다. URI 템플릿이 int 매개 변수와 잘 작동하지 않습니다. 문자열로 변경하십시오. 작동합니다.

URITemplate과 함께 int를 사용하려면 자신의 QuerystringConverter를 작성해야한다고 생각합니다.

관련 문제