调用 WCF 服务时 JSONP 自动完成失败

Posted

技术标签:

【中文标题】调用 WCF 服务时 JSONP 自动完成失败【英文标题】:JSONP autocomplete failing when calling WCF service 【发布时间】:2012-11-15 17:58:30 【问题描述】:

我需要为我们的一个网络表单提供 JSONP 自动完成功能,与此相同:http://jqueryui.com/autocomplete/#remote-jsonp。

基本上,我想用从我的 WCF 服务返回的值动态填充下拉列表,这些值与用户输入的搜索词匹配。

WCF服务成功命中,文本框内容成功作为搜索参数传入。 webservice返回,但我总是陷入jQuery中的“错误:”块。

这是调用我自己的 WCF 服务的重组 jQuery(取自上面链接的 AutoComplete 示例):

$("#txtModels").autocomplete(
    source: function (request, response) 
        $.ajax(
            url: "http://localhost:12345/webapi/models",
            dataType: "jsonp",
            data: 
                search: request.term
            ,
            success: function (data) 
                alert("Success");  //never reach here
                //response($.map(data.models, function (item) 
                //   return 
                //        label: item.model,
                //        value: item.model
                //    
                //));
            ,
            error: function() 
                alert("Error");  //always an error
            
        );
    ,
    minLength: 2,
    select: function (event, ui) 
        //log(ui.item ?
        //    "Selected: " + ui.item.label :
        //    "Nothing selected, input was " + this.value);
    ,
    open: function () 
        //$(this).removeClass("ui-corner-all").addClass("ui-corner-top");
    ,
    close: function () 
        //$(this).removeClass("ui-corner-top").addClass("ui-corner-all");
    
);

这是 WCF 服务。它确实会被击中并返回而不会出错。

[OperationContract]
[WebInvoke(Method = "GET",
            BodyStyle = WebMessageBodyStyle.Wrapped,  //tried ".Bare" also
            ResponseFormat = WebMessageFormat.Json,
            UriTemplate = "models?search=search")]
public string[] GetBoxSerialNums(string search)

    string[] models = new string[]"Ford", "Chevy", "Honda";
    return models;

WCF 项目是使用内置 WCF 模板创建的,因此我的 web.config 没有端点配置,但无论如何:

<?xml version="1.0"?>
<configuration>
  <connectionStrings>
    <!--removed-->
  </connectionStrings>

  <system.web>
    <compilation debug="true" targetFramework="4.0" />
  </system.web>

  <system.webServer>
    <modules runAllManagedModulesForAllRequests="true">
      <add name="UrlRoutingModule" type="System.Web.Routing.UrlRoutingModule, System.Web, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
    </modules>
  </system.webServer>

  <system.serviceModel>
    <serviceHostingEnvironment aspNetCompatibilityEnabled="true" multipleSiteBindingsEnabled="true"/>
    <standardEndpoints>
      <webHttpEndpoint>
        <!-- 
            Configure the WCF REST service base address via the global.asax.cs file and the default endpoint 
                        via the attributes on the <standardEndpoint> element below
        -->
        <standardEndpoint name="" helpEnabled="true" automaticFormatSelectionEnabled="false" maxReceivedMessageSize="10240000" maxBufferSize="10240000" />
      </webHttpEndpoint>
    </standardEndpoints>
  </system.serviceModel>

  <appSettings>
    <!--removed-->
  </appSettings>

</configuration>

我对 jQuery/JSON 非常陌生,尤其是 JSONP,但很明显 web 服务没有以 jQuery 调用所期望的格式返回数据。我需要做什么才能完成这项工作?

【问题讨论】:

【参考方案1】:

通过在system.serviceModel 中添加bindings 来更改您的web.config:

<bindings>
  <webHttpBinding>
    <binding name="webHttpBindingWithJsonP" crossDomainScriptAccessEnabled="true" />
  </webHttpBinding>
</bindings>

并将bindingConfiguration="webHttpBindingWithJsonP" 添加到您的&lt;endpoint&gt; 标记中。

然后最后通过删除BodyStyleUriTemplate 来更改您的网络方法:

[WebInvoke(Method = "GET",
           //BodyStyle = WebMessageBodyStyle.Wrapped,  //tried ".Bare" also
           ResponseFormat = WebMessageFormat.Json
           //UriTemplate = "models?search=search"
           )]
public string[] GetBoxSerialNums(string search)

现在 WCF 服务的响应应该是这样的:

jQuery16409075580490753055_1354078880656(["Ford","Chevy","Honda"]);

这符合 JSONP 要求并且应该可以工作。

【讨论】:

"并将bindingConfiguration="webHttpBindingWithJsonP" 添加到您的 标记中。"你能澄清一下吗?这在 web.config 中的位置,因为我目前没有明确定义任何端点。 *编辑:另外,这会影响我在同一解决方案中的其他 wcf 服务吗?我显然不想破坏现有的功能。 抱歉,我不确定这一点,因为我之前没有使用 WCF 处理 JSONP,我只是将 WCF 服务 (.svc) 添加到我现有的 Testapplication (.net MVC) 中,并将其作为我很好奇我是否让它工作(我做到了,就像描述的那样)。不知道你们为什么没有端点配置? 该项目是从一个模板(文件 -> 新建 -> 项目 -> 在线模板 -> WCF Rest 服务模板)创建的,它为您提供了一个裸 web.config。我最终放弃了这种方法并采用了 json/webservice 解决方案。感谢您的帮助。 好的,不用担心。只要您在同一台服务器上,就应该使用 json,这是正确的。但是我以为你用的是jsonp是因为你不在同一个服务器上? 正确,最初该解决方案不会在同一台服务器上运行,所以我专注于 jsonp。最后,我能够在同一台服务器上托管,所以我采用了更简单的 json 方法。 WCF 及其所有配置都很混乱,所以我很高兴能摆脱它。

以上是关于调用 WCF 服务时 JSONP 自动完成失败的主要内容,如果未能解决你的问题,请参考以下文章

使用 WCF .NET3.5 的跨域调用/JSONP

WCF:使用 JSONP 将来源列入白名单

WCF 跨域使用 Jsonp 错误未捕获语法错误:意外令牌:

C#将控制器数据返回到JSONP输出以进行自动完成[重复]

C#调用WCF问题汇总

通过 SSL 使用 JSONP 的 WCF 服务