调用 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"
添加到您的<endpoint>
标记中。
然后最后通过删除BodyStyle
和UriTemplate
来更改您的网络方法:
[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"
添加到您的 以上是关于调用 WCF 服务时 JSONP 自动完成失败的主要内容,如果未能解决你的问题,请参考以下文章