如何在 IIS 8.5 中从 web.api 站点返回 jsonp



我在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[] { };
            }
        }

最新更新