2013-03-20 1 views
3

나는 이것을 몇 시간 동안 검색해 왔으며이를 작동시키기 위해 여러 가지 시도를 해왔다. 나는 stackoverflow에 너무 많은 기사를 시도하고 나도 일을 얻으려면 너무 어리 석거나 나는 기쁨을 경험하지 못하게 막는 독특하고 이상한 구성을 가지고있다.WCF 서비스 만들기 jQuery.AJAX()에서 JSON 데이터 수락

http://www.codeproject.com/Articles/97204/Implementing-a-Basic-Hello-World-WCF-Service

그것은 매우 기본적인 하나 개의 방법이 있고 내가하고 싶은 모든 날 jQuery.AJAX 그것을 소비 할 수있다() :

나는이 튜토리얼에 의해 설명 된 WCF 서비스를 만들 json을 사용합니다.

IIS에서 호스팅되어 작동합니다. 나는 문제없이 WSDL에 접근 할 수있다.

나는 다음과 같은 코드로 소비하려고 : 난 항상 오류가 발생할 수

$.ajax({ 
    dataType: 'json', 
    type: 'POST', 
    contentType: "application/json", 
    url: "//localhost:546/HelloWorldService.svc/GetMessage", 
    data: { 
     name: "Joe" 
    } 
    }).done(function(msg){ 
     console.log(msg); 
     $("#result").append(msg); 
}); 

. 내가 뭘 시도했는지에 따라 500 개의 오류, 402 개의 오류, 잘못된 내용에 관한 오류가 발생합니다 ... 모든 오류.

다음 기사의 솔루션 구현을 시도했습니다. 그들은 나를 Web.config의 끝점을 변경할 필요 범위 인터페이스에

[WebInvoke(Method = "POST", UriTemplate = "json/PostSalesOrderData", RequestFormat = WebMessageFormat.Json, ResponseFormat = WebMessageFormat.Json, BodyStyle = WebMessageBodyStyle.Bare)] 

같은 추가 것들 (나는 내가 그들을 변경해야하지만 시도 아무것도 지금까지 JSON 엔드 포인트를 추가하는 측면에서 작동하지 않습니다 알고있다).

여기 제가 살펴본 기사 중 상당수가 성공하지 못하게하기 위해 내 해결책을 강타하려고 시도한 기사가 있습니다.

Two endpoint (soap ,json) and one service method

WCF REST Service not accepting JSON in .Net 4

WCF Services with JSON, JSONP and SOAP End Points

HTTP/1.1 415 Cannot process the message because the content type 'application/json; charset=utf-8' was not the expected type 'text/xml; charset=utf-8'

Javascript JSON and WCF webservice on Phonegap Android

나는이 자습서를 가서 그가 내 솔루션 작업을 얻기 위해 무슨 말을했다 사용하려고했습니다. 아직도 아무것도!

http://www.primordialcode.com/blog/post/passing-json-serialized-objects-wcf-service-jquery

이 내 인터페이스는

[ServiceContract] 
public interface IHelloWorldService 
{ 
    [OperationContract] 
    [WebInvoke(UriTemplate = "GetMessage", Method = "POST", 
     BodyStyle = WebMessageBodyStyle.WrappedRequest, 
     RequestFormat = WebMessageFormat.Json, 
     ResponseFormat = WebMessageFormat.Json)] 
    String GetMessage(String name); 
} 

사람이 나에게 기쁨을 경험 도와 드릴까요 모습입니다?

내 질문을 미리 보아 주셔서 감사합니다. 더 많은 정보가 필요하거나 충분한 정보를 제공하지 못 했으므로 도와 드리겠습니다.

나는 어리석은 뭔가를 놓치고 있어야합니다 ... 나는 이것이 어렵지 않다는 것을 알고 있습니다.

편집 :

Working Web.구성

<?xml version="1.0"?> 
<configuration> 
    <system.web> 
    <compilation debug="false" targetFramework="4.0" /> 
    </system.web> 
    <system.webServer> 
    <modules runAllManagedModulesForAllRequests="true"/> 
    </system.webServer> 
    <system.serviceModel> 
    <behaviors> 
     <endpointBehaviors> 
     <behavior name="WebHTTPEndpointBehavior"> 
      <webHttp /> 
     </behavior> 
     </endpointBehaviors> 
     <serviceBehaviors> 
     <behavior name="MyServiceTypeBehaviors"> 
      <serviceMetadata httpGetEnabled="true" /> 
      <serviceDebug includeExceptionDetailInFaults="false" /> 
     </behavior> 
     </serviceBehaviors> 
    </behaviors> 
    <bindings> 
     <webHttpBinding> 
     <binding name="MyWebServiceBinding" maxBufferSize="2147483647" maxReceivedMessageSize="2147483647"/> 
     </webHttpBinding> 
    </bindings> 
    <services> 
     <service name="MyWCFServices.HelloWorldService" 
     behaviorConfiguration="MyServiceTypeBehaviors"> 
     <endpoint address="" binding="webHttpBinding" bindingConfiguration="MyWebServiceBinding" behaviorConfiguration="WebHTTPEndpointBehavior" 
      contract="MyWCFServices.IHelloWorldService"/> 
     <endpoint contract="IMetadataExchange" 
      binding="mexHttpBinding" address="mex"/> 
     </service> 
    </services> 
    </system.serviceModel> 
</configuration> 

답변

4

변화

data: JSON.stringify({name: 'Joe'}); 

편집이 라인

data: { 
    name: "Joe" 
} 

:

는 서비스에이 작업을 수행합니다. 구성에 WebHttp 바인딩을 추가하십시오.

<behaviors> 
    <endpointBehaviors> 
    <behavior> 
     <webHttp /> 
    </behavior> 
    </endpointBehaviors> 
</behaviors> 

어디에서 추가할까요? 나에게 알려주지 않으면 나는 약간의 정보를 제공하려고 노력할 것이다.

편집 :

<behavior name="myBehaviorName"> 
     <webHttp /> 
</behavior> 

<service name="MyWCFServices.HelloWorldService" 
     behaviorConfiguration="MyServiceTypeBehaviors"> 
    <endpoint address="" binding="webHttpBinding" 
     contract="MyWCFServices.IHelloWorldService" behaviorConfiguration="myBehaviorName"/> 
    <endpoint contract="IMetadataExchange" 
     binding="mexHttpBinding" address="mex"/> 
    </service> 
+0

감사를 추가하는 것을 잊었다. 그래도 여전히 500 오류가 발생하고 있습니다 ... 나는 문제가 service/web.config가 반드시 .ajax 호출이 아닌 것으로 생각합니다. – Steve

+1

오류 설명은 무엇입니까? 및 귀하의 URL 주소 "url :"//localhost:546/HelloWorldService.svc/HelloWorldService "하지만 GetMessage를 호출하는 중입니까? 여기에 문제가 있습니까? –

+0

좋아, 의견에 따라 진행했습니다. URL을 Localhost : 546/HelloWorldService.svc/GetMessage로 변경했습니다. 이제 다음과 같은 오류가 있습니다 : POST http : // localhost : 546/HelloWorldService.svc/GetMessage 415 (내용 유형 'application/json '는 예상 유형'application/soap + xml; charset = utf-8 '이 아니 었습니다.) – Steve

1

내가 늦게오고, 내 댓글에 최대 다음,하지만 당신은 여전히 ​​당신이 일을 얻기 위해 해결해야합니다 몇 가지 문제가 있습니다. 엔드 포인트의 바인딩을 변경하여 HTTP 조작을 지원해야합니다.

<bindings> 
    <webHttpBinding> 
     <binding name="MyWebServiceBinding" maxBufferSize="2147483647" maxReceivedMessageSize="2147483647"/> 
    </webHttpBinding> 
</bindings> 
<behaviors> 
    <endpointBehaviors> 
     <behavior name="WebHTTPEndpointBehavior"> 
      <webHttp helpEnabled="true"/> 
     </behavior> 
    </endpointBehaviors> 
</behaviors> 
<services> 
    <service name="MyWCFServices.HelloWorldService" 
     behaviorConfiguration="MyServiceTypeBehaviors"> 
    <endpoint address="" binding="webHttpBinding" bindingConfiguration="MyWebServiceBinding" behaviorConfiguration="WebHTTPEndpointBehavior" 
     contract="MyWCFServices.IHelloWorldService"/> 
    <endpoint contract="IMetadataExchange" 
     binding="mexHttpBinding" address="mex"/> 
    </service> 
</services> 

maxBufferSizemaxReceivedMessageSize는 선택 사항입니다.

편집 :. 아차, 응답에 대한 귀하의 behaviorConfiguration

+2

webHttp 비헤이비어에 helpEnabled = "true"를 추가하지 않아도됩니다. 사용 가능한 작업을 볼 수 있습니다. 서비스 바인딩 지점으로 이동할 때. – Justin

+1

좋은 지적. 내 서비스에서 사용 했으므로 OP에 최소 요구 사항이 무엇인지 알 수 있도록 여분의 항목을 추가하고 싶지 않았습니다. 내 대답을 업데이트 할게. – Thelonias

+0

이것은 엄청난 도움이되었습니다. 서비스는 적어도 지금 일하고있다. 이 서비스는 "허용되지 않는 방법"이라고 알려주지 만 원래의 게시물 범위를 벗어난 것 같습니다. – Steve