WCF Ajax调用无法与Jquery $.ajax一起使用

5

我有以下jQuery代码(服务名称更改):

var url = "http://localhost/services/MyService.svc/addentrant";
var stuff = $("#signup-form").serializeArray();

$.ajax({
    type: "POST",
    url: url,
    contentType: "application/json; charset=utf-8",
    data: stuff,
    timeout: 10000,
    success: function (obj) { alert('yay!'); }
});

以上内容是对我的本地IIS7.5服务器上托管的Sitefinity中的WCF服务发出请求。以下是相关的web.config文件:

<endpointBehaviors>
<behavior name="jsonBehavior">
  <webHttp/>
</behavior>
...
<serviceBehaviors>
        <behavior name="DefaultBehavior">
          <serviceMetadata httpGetEnabled="true"/>
        </behavior>
...
<services>
 <service behaviorConfiguration="DefaultBehavior" name="Services.MyService" >
        <endpoint address="" behaviorConfiguration="jsonBehavior" binding="webHttpBinding" contract="Services.IMyService" bindingConfiguration=""/>
        <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/>
 </service>
...

最后,MyService的接口和实现:

[ServiceContract(Name = "MyService", Namespace = "http://myservice.com/services/2010/")]
public interface IMyService
{
    [OperationContract,
    WebInvoke(Method = "POST",
              ResponseFormat = WebMessageFormat.Json,
              BodyStyle = WebMessageBodyStyle.WrappedRequest,
              UriTemplate = "addentrant")]
    void AddEntrant(string firstName);
}
...
[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
public class MyService : IMyervice
{
...
    public void AddEntrant(string firstName)
    {
        Entrant entrant = new Entrant()
        {
            FirstName = firstName,
        };
        context.Entrants.InsertOnSubmit(entrant);
        context.SubmitChanges();
    }
}

我想这就是全部了。无论如何,$.ajax调用返回成功,但是Web服务方法没有被调用(我设置了断点)。我打开了Fiddler并发现我收到了405:不允许的方法。我以前见过这种情况,但只有在我忘记设置方法允许POST请求时才会出现。我很困惑为什么现在会这样。
另外,奇怪的是,如果我克隆在Fiddler中捕获的ajax请求,我会得到以下结果:
OPTIONS /services/MyService.svc/addentrant HTTP/1.1
Host: localhost
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.2.8) Gecko/20100722 Firefox/3.6.8
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-us,en;q=0.5
Accept-Encoding: gzip,deflate
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
Keep-Alive: 115
Connection: keep-alive
Origin: http://localhost:6339
Access-Control-Request-Method: POST

只有头部信息,没有需要讲述的请求主体。

另外一个问题——stuff看起来是什么样子的?它序列化成firstName: "name"(伪代码)吗? - David Hoerster
这是一个jQuery序列化的数组对象,类似于[Object { name="firstName", value="Bob" }, {name="lastName", value="Bob"}...]。 - Dusda
我不确定在您的服务中,firstName字符串如何映射到您发送的序列化JavaScript对象文字。这只是伪代码吗?此外,在您粘贴的ajax请求捕获中,您从哪里复制了该数据?如果您点击请求面板(右上角)中的“TextView”选项卡,您没有看到有效载荷吗? - David Hoerster
实际上,现在我看了你的 Fiddler 请求,你使用的 HTTP 动词是 OPTIONS,而不是 POST。这就是为什么你会得到 405 的原因。如果我使用只允许 POST 的 POST 请求尝试进行 GET,我会在 Fiddler(和我的应用程序)中得到 405。所以我想知道你的机器上是否还有其他运行的东西(代理?)会导致这种情况?你的客户端和服务器是否在同一个域上(同一台服务器,同一端口——例如,localhost:53128)? - David Hoerster
请告诉我您的问题是否已解决 - 我现在很好奇。 - David Hoerster
显示剩余5条评论
2个回答

0

另一个尝试的方法是在您的$.ajax调用中不设置contentType,而是使用dataType: "json"

$.ajax({
    type: "POST",
    url: url,
    dataType: "json",
    data: stuff,
    timeout: 10000,
    success: function (obj) { alert('yay!'); }
});

1
尝试过了,行为没有改变。 - Dusda

0

如果你尝试使用GET而不是POST会发生什么?

尝试清除缓存或在URL后添加时间戳 - 浏览器可能已经缓存了200响应代码。


我能够使用$.get让它运作起来;但我希望只用那个就可以完成,但这是一个比赛报名表 :/。我将尝试附加时间戳。 - Dusda
当我在结尾添加时间戳时,没有任何变化。叹气 - Dusda

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