WCF Ajax 调用不适用于 Jquery $.ajax

Posted

技术标签:

【中文标题】WCF Ajax 调用不适用于 Jquery $.ajax【英文标题】:WCF Ajax Call not working with Jquery $.ajax 【发布时间】:2011-04-04 11:08:59 【问题描述】:

我有以下 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"(伪代码)? 这是一个 jQuery 序列化数组对象,如 [Object name="firstName", value="Bob" , name="lastName", value="Bob"...]。 我不确定在您的服务中,firstName 字符串如何映射到您发送的内容(序列化的 javascript 对象文字)。这只是伪代码吗?此外,使用您粘贴的 ajax 请求捕获,您从哪里复制该数据?如果您单击“请求”窗格(位于右上角)中的“TextView”选项卡,您看不到您的有效负载吗? 实际上,现在我查看了您的 Fiddler 请求,您使用的 HTTP 动词是 OPTIONS,而不是 POST。这就是为什么您要返回 405 的原因。如果我接受只允许 POST 的 POST 请求并尝试执行 GET,我会在 Fiddler(和我的应用程序)中得到 405。所以我想我想知道你的机器(代理?)上是否还有其他东西会导致这种情况?您的客户端和服务器是否在同一个域中(相同的服务器、相同的端口——例如 localhost:53128)? Web 服务托管在 localhost(在 IIS7.5 中)。发出 $.ajax 请求的站点托管在 localhost:24526 (一些随机端口,在应用程序开发服务器中)。我注意到 Fiddler 一直使用 OPTIONS 动词克隆请求;不知道为什么要这样做。似乎从 $.ajax is OPTIONS 发送的请求标头似乎,但这没有任何意义。我实际上并没有在 Fiddler 中看到有效负载 :(. 【参考方案1】:

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

尝试清除缓存或将时间戳附加到 url - 200 响应代码可能已被浏览器缓存

【讨论】:

我能够使用 $.get;希望我可以通过使用它来获得,但这是一个竞赛报名表:/。将尝试附加时间戳。 当我在末尾添加时间戳时没有变化。 叹息【参考方案2】:

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

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

【讨论】:

试过了,行为没有改变。

以上是关于WCF Ajax 调用不适用于 Jquery $.ajax的主要内容,如果未能解决你的问题,请参考以下文章

添加 FriendlyUrls 时,jQuery ajax 调用不适用于 ASP.Net Web 窗体

wordpress 中的 Ajax 调用不适用于前端站点的订阅者用户

jquery UI 可拖动不适用于 AJAX

jRaty jQuery 插件似乎不适用于 AJAX/JSON

Jquery ajax 不适用于 phonegap 应用程序

jQuery - 使用 ajax 调用将 JSON 发送到 WCF 服务为空