我在Visual Studio 2013中创建了一个web.api解决方案。预计跨域问题,我安装了WebApiContrib.Formatting.Jsonp Nuget包。我在解决方案中创建了一个从jquery调用web.api服务的Web应用程序。通常我的 ajax 请求如下所示:
var request = $.ajax({
url: uri + '/api/events/',
type: 'GET',
dataType: 'jsonp',
crossDomain: true
});
我最初是在Windows 7中启动该项目的,最近升级到Windows 10。这一切都在VS 2013/IIS Express本地工作正常 - web.api向调用脚本返回一个json事件数组。我还将 web.api 项目发布到在 IIS 10 下运行的本地网站上,那里也很好。
因此,我将web.api部署到运行IIS 8.5的开发服务器Windows Server 2012 R2。当我请求 http://devservername/api/events/时,出现错误:请求 URI 中未提供回调参数
错误图像 - 请求 URI 中未提供回调参数
开发服务器运行 asp.net 4.5。我担心我无法在本地处理回调参数,但这种技术在目标服务器上失败了。或者更糟糕的是,这是一个部署/配置问题。任何人都可以在这里推荐最好的方法吗?
谢谢。
我做了更多的挖掘,并在web.api项目中添加了一些错误日志记录和跟踪。事实证明,显示的错误是正确的 - 当尝试从Internet Explorer访问web.api方法时,除非提供回调参数,否则会发生此错误(应该发生)。Chrome 和 Firefox 愉快地显示数据源的 XML 版本。在IE中,如果附加了?callback=something,那么IE将尝试返回数据。jQuery通过在AJAX请求中自动附加回调参数来隐藏所有这些。
如果尝试从 C# 服务器端调用 web.api 方法,则必须在调用中附加此参数:
using (WebClient wc = new WebClient())
{
// wc.Headers.Add("user-agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.2; .NET CLR 1.0.3705;)");
wc.Headers.Add("Accept", "application/jsonp");
NameValueCollection nvc = new NameValueCollection();
nvc.Add("callback", "jsonCallback");
wc.QueryString = nvc;
try
{
string result = wc.DownloadString(MyWebApiUrl);
var json = System.Text.RegularExpressions.Regex.Match(result, @".+((.+)).+").Groups[1].Value;
events = JsonConvert.DeserializeObject<Event[]>(json);
}
catch (Exception)
{
events = new Event[] { };
}
}