使WCF服务接受来自jQuery.AJAX()的JSON数据

4

我已经搜寻了几个小时并尝试了不同的方法来使它工作。我已经看了很多stackoverflow上的文章,但我要么太蠢了无法让它正常工作,要么我的配置有一些独特和奇怪的问题阻止了我体验乐趣。

我按照这个教程创建了WCF服务:

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

这是一个非常基础的服务,只有一个方法,我只想使用json来消费它的jQuery.AJAX()。

我将它托管在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端点(我知道我必须更改它们,但迄今为止我尝试的所有方法都无法添加JSON端点)到添加像...这样的内容。
[WebInvoke(Method = "POST", UriTemplate = "json/PostSalesOrderData", RequestFormat = WebMessageFormat.Json, ResponseFormat = WebMessageFormat.Json, BodyStyle = WebMessageBodyStyle.Bare)]

到接口。

以下是我查阅的一些文章,我试图将它们融入我的解决方案中,但并没有太大的成功。

Javascript JSON和Phonegap Android上的WCF Web服务

HTTP/1.1 415无法处理消息,因为内容类型“application/json; charset=utf-8”不是预期的类型“text/xml; charset=utf-8”

具有JSON、JSONP和SOAP端点的WCF服务

两个端点(soap,json)和一个服务方法

WCF REST服务在.Net 4中不接受JSON

我还查看了这个教程,并尝试使用他的建议来使我的解决方案工作。但仍然没有任何进展!

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);
}

有人能帮助我体验喜悦吗?

非常感谢您查看我的问题。如果您需要更多信息或我没有提供足够的信息,请让我知道,以便我帮助您帮助我!

我一定缺少了什么愚蠢的东西……我知道这并不难。

编辑:

可用的Web.Config

<?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>
2个回答

5

修改此行

data: {
    name: "Joe"
}

转化为

data: JSON.stringify({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>

1
错误描述是什么?您的URL声明为"url: "//localhost:546/HelloWorldService.svc/HelloWorldService",但您所进行的调用是GetMessage吗?这里有什么问题吗? - Sujesh Arukil
1
哦,我的错!请对您的服务进行以下操作。 - Sujesh Arukil
1
编辑了我的答案。很抱歉,添加到评论中的信息太多了。 - Sujesh Arukil
嘿,我觉得我正在取得更多进展。我在我的原始问题中添加了我的web.config,但现在我仍然遇到一个新的错误。 - Steve
2
将wsBinding更改为webHttpBinding,在您定义WebHttp的行为中添加名称,并向您的终端点添加behaviorConfiguration作为该名称。 - Sujesh Arukil
显示剩余3条评论

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
这真是非常有帮助。服务至少现在可以工作了。服务告诉我“方法不允许”,但我认为这超出了我最初发布的范围。 - Steve

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接