Asp.net 为什么我的JsonpMediaTypeFormatter不处理我的WCF请求?

Asp.net 为什么我的JsonpMediaTypeFormatter不处理我的WCF请求?,asp.net,wcf,jsonp,wcf-data-services,odata,Asp.net,Wcf,Jsonp,Wcf Data Services,Odata,G'day朋友(我是美国人,但G'day听起来很酷) 我刚刚安装了WCF Data Services 5.0软件包以及最新的ASP.NET Web API,我遇到了一个非常恼人的问题。。通过在谷歌上搜索,我肯定不是唯一一个经历过这个问题的人,但我发现的所有解决方案似乎都不起作用 我的问题是,主机应用程序不接受包含$字符的请求,无论我尝试什么,它都不会将请求传递给我的JsonpMediaTypeFormatter。因此,我不知道格式化程序是否会修复实际问题 使用fiddler,我可以看到请求是用“

G'day朋友(我是美国人,但G'day听起来很酷)

我刚刚安装了WCF Data Services 5.0软件包以及最新的ASP.NET Web API,我遇到了一个非常恼人的问题。。通过在谷歌上搜索,我肯定不是唯一一个经历过这个问题的人,但我发现的所有解决方案似乎都不起作用

我的问题是,主机应用程序不接受包含
$
字符的请求,无论我尝试什么,它都不会将请求传递给我的
JsonpMediaTypeFormatter
。因此,我不知道格式化程序是否会修复实际问题

使用fiddler,我可以看到请求是用“
*/*
”的“
Accepts
”头发出的,我想象它不会进入我的格式化程序,而且我不能将“
*/*
”添加到
MediaTypeHeaderValue
,因为它抱怨它是一个范围

如果您有任何帮助或建议,我们将不胜感激


设置的完整说明 我创建了一个沙盒解决方案来进行测试,它由两个ASP.NET web应用程序项目组成。第一个项目被称为
ClientApplication
,第二个项目被称为
HostApplication
(我相信您可以推断哪个做什么)。它们中的每一个都由我的本地IIS托管在不同的网站和IP地址中。我尽可能多地创建它们,就好像它们在物理上完全分离,而实际上不需要服务器一样

主机应用程序 有一个简单的EDMX文件映射到一个更简单的数据库,其中有一些基本的表,没有什么特别的。我的服务级别如下:

公共类ODataService:DataService { 公共静态void InitializeService(DataServiceConfiguration配置) { config.DataServiceBehavior.MaxProtocolVersion=DataServiceProtocolVersion.V3; config.UseVerboseErrors=true; config.SetEntitySetAccessRule(“客户”,EntitySetRights.All); config.SetEntitySetAccessRule(“Employees”,EntitySetRights.All); config.SetEntitySetAccessRule(“随机数据”,EntitySetRights.All); config.SetEntitySetAccessRule(“Schedules”,EntitySetRights.All); config.SetEntitySetAccessRule(“Shift”,EntitySetRights.All); } } 我使用的代码与Peter Moberg在对以下问题的评论中使用的JsonpMediaTypeFormatter的代码相同:

最后,我在
Global.asax
文件中注册了我的
JsonpMediaTypeFormatter

受保护的无效应用程序\u启动(对象发送方,事件参数e)
{
var config=GlobalConfiguration.Configuration;
Insert(0,新的JsonpMediaTypeFormatter());
}
客户端应用程序 为了将这一切结合起来,我在客户端应用程序中有一个非常简单的页面,其中包含以下代码:


服务客户端应用程序
函数makeServiceCall()
{
尝试
{
/*
$.getJSON('http://10.10.1.7/ODataService.svc/Customers?$format=json&$callback=?',
功能(响应)
{
$.each(response.d、函数(索引、值)
{
var div=document.createElement('div');
div.innerHTML=value.ClientName;
$('#result')。追加(div);
})
});
*/
$.ajax({
类型:“POST”,
url:“http://10.10.1.7/ODataService.svc/Customers",
数据类型:“json”,
contentType:“应用程序/json”,
成功:函数(结果){alert(“winding.”;},
错误:函数(结果){alert(“Losing…”);}
});
}
捕捉(错误)
{
警惕(err);
}
}
呼叫服务
您可能会注意到其中有一些已注释的javascript。。这是因为我尝试了两种不同的方式拨打服务电话(这两种方式都不起作用),我想肯定地告诉大家

再次感谢!
Jason

您尝试使用的JSONP帮助程序是为与WebAPI一起使用而设计的。您的服务使用WCF数据服务。尽管它们的表现相似,但它们并不相同。JSONP助手将不能与WCF数据服务一起工作。在这里可以找到有效的方法:


请注意,在WCF DS 5.0中,JSON的行为发生了变化,上面页面上的注释也显示了如何修复代码以与5.0配合使用。

几个初始注释:1。OData使用HTTP谓词遵循典型的REST约定,这意味着如果您想要回拉数据,则需要使用GET而不是POST。2.您不需要完整的WCF数据服务包和Web API—据我所知,Web API最终将使用ODataLib,但他们的NuGet包应该提供您所需要的。3.WCF数据服务本身还不支持$format;WebAPI可能会,但我不确定。看起来您尝试访问的服务是完整的WCF数据服务服务。4.试用data.js进行客户端访问。谢谢Vitek!应用该链接中的技术解决了问题。