G'day朋友(我是美国人,但G'day听起来很酷)
我刚刚安装了WCF Data Services 5.0软件包以及最新的ASP.NET Web API,并且遇到了一个非常烦人的问题。从Google上搜索,我绝对不是唯一一个经历过这个问题的人。我找到的解决方案似乎都没有起作用。
我的问题是主机应用程序不接受包含$
字符的请求,无论我尝试什么,它都不会将请求传递给我的JsonpMediaTypeFormatter
。因此,我不知道格式化程序是否会解决实际问题。
使用fiddler,我可以看到请求是使用“Accepts
”标题“*/*
”进行的,我想这不是我的格式化程序,我无法添加“*/*
”到MediaTypeHeaderValue
,因为它抱怨它是一个范围。
请提供任何帮助或建议!
我创建了一个用于测试的沙箱解决方案,它由两个ASP.NET Web应用程序项目组成。第一个项目称为ClientApplication
,第二个项目称为HostApplication
(我相信你可以推断出哪个做了什么)。它们中的每一个都由我的本地IIS托管在不同的网站和IP地址中。我尽可能多地创建它们,好像它们完全是物理分离而不需要服务器。
有一个简单的EDMX文件映射到一个更简单的数据库,里面有几个基本表,没什么特别的。我也有我的服务类如下:
public class ODataService : DataService<Data.SandboxEntities>
{
public static void InitializeService(DataServiceConfiguration config)
{
config.DataServiceBehavior.MaxProtocolVersion = DataServiceProtocolVersion.V3;
config.UseVerboseErrors = true;
config.SetEntitySetAccessRule("Customers", EntitySetRights.All);
config.SetEntitySetAccessRule("Employees", EntitySetRights.All);
config.SetEntitySetAccessRule("RandomDatas", EntitySetRights.All);
config.SetEntitySetAccessRule("Schedules", EntitySetRights.All);
config.SetEntitySetAccessRule("Shifts", EntitySetRights.All);
}
}
我在Peter Moberg的评论中使用的JsonpMediaTypeFormatter
使用相同的代码:JSONP with ASP.NET Web API
最后,我在JsonpMediaTypeFormatter
文件中注册了Global.asax
:
protected void Application_Start(object sender, EventArgs e)
{
var config = GlobalConfiguration.Configuration;
config.Formatters.Insert(0, new JsonpMediaTypeFormatter());
}
为了将它们整合在一起,我在客户端应用程序中有一个非常简单的页面,其中包含以下代码:
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title>Service Client Application</title>
<script src="Scripts/jquery-1.7.2.js" type="text/javascript"></script>
<script type="text/javascript">
function makeServiceCall()
{
try
{
/*
$.getJSON('http://10.10.1.7/ODataService.svc/Customers?$format=json&$callback=?',
function (response)
{
$.each(response.d, function (index, value)
{
var div = document.createElement('div');
div.innerHTML = value.ClientName;
$('#result').append(div);
})
});
*/
$.ajax({
type: "POST",
url: "http://10.10.1.7/ODataService.svc/Customers",
dataType: "json",
contentType: "application/json",
success: function (result) { alert("Winning."); },
error: function (result) { alert("Losing..."); }
});
}
catch (err)
{
alert(err);
}
}
</script>
</head>
<body>
<form id="MainForm" runat="server">
<div id="result" style="border:1px solid black;background-color:#E8E8E8;"></div>
<button onclick="makeServiceCall();return false;">Call Service</button>
</form>
</body>
</html>
你可能会注意到那里有一些评论的javascript ..这是因为我尝试了两种不同的方式进行服务调用(两者都没有用),我想一定要注意到你们。
再次感谢! 杰森
答案 0 :(得分:2)
您尝试使用的JSONP帮助程序旨在与WebAPI一起使用。您的服务使用WCF数据服务。即使他们执行类似的事情,他们也不一样。并且JSONP帮助程序不能与WCF数据服务一起使用。可以在此处找到有效的方法:http://archive.msdn.microsoft.com/DataServicesJSONP
请注意,在WCF DS 5.0中,围绕JSON的行为发生了变化,上面页面上的注释显示了如何修复代码以使用5.0。