首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >使用ASP.NET Web API的JSONP

使用ASP.NET Web API的JSONP
EN

Stack Overflow用户
提问于 2012-02-24 05:07:25
回答 13查看 64K关注 0票数 136

我正在使用Web在ASP.MVC MVC4中创建一组新的服务。到目前为止,它还不错。我已经创建了服务并使其正常工作,现在我正尝试使用JQuery来使用它。我可以使用Fiddler取回JSON字符串,这看起来没问题,但因为服务存在于单独的站点上,所以尝试调用它时会出现JQuery错误,并显示“不允许”。因此,这显然是我需要使用JSONP的情况。

我知道Web API是新的,但我希望有人能帮助我。

如何使用JSONP调用Web API方法?

EN

回答 13

Stack Overflow用户

回答已采纳

发布于 2012-02-24 06:10:49

在问了这个问题之后,我终于找到了我需要的东西,所以我回答了它。

我遇到了这个JsonpMediaTypeFormatter。通过执行以下操作将其添加到global.asax的Application_Start中:

代码语言:javascript
复制
var config = GlobalConfiguration.Configuration;
config.Formatters.Insert(0, new JsonpMediaTypeFormatter());

您可以使用如下所示的JQuery AJAX调用:

代码语言:javascript
复制
$.ajax({
    url: 'http://myurl.com',
    type: 'GET',
    dataType: 'jsonp',
    success: function (data) {
        alert(data.MyProperty);
    }
})

它似乎工作得很好。

票数 132
EN

Stack Overflow用户

发布于 2012-06-03 23:37:29

以下是用于WebAPI RC的JsonpMediaTypeFormatter的更新版本:

代码语言:javascript
复制
public class JsonpMediaTypeFormatter : JsonMediaTypeFormatter
{
    private string callbackQueryParameter;

    public JsonpMediaTypeFormatter()
    {
        SupportedMediaTypes.Add(DefaultMediaType);
        SupportedMediaTypes.Add(new MediaTypeHeaderValue("text/javascript"));

        MediaTypeMappings.Add(new UriPathExtensionMapping("jsonp", DefaultMediaType));
    }

    public string CallbackQueryParameter
    {
        get { return callbackQueryParameter ?? "callback"; }
        set { callbackQueryParameter = value; }
    }

    public override Task WriteToStreamAsync(Type type, object value, Stream stream, HttpContent content, TransportContext transportContext)
    {
        string callback;

        if (IsJsonpRequest(out callback))
        {
            return Task.Factory.StartNew(() =>
            {
                var writer = new StreamWriter(stream);
                writer.Write(callback + "(");
                writer.Flush();

                base.WriteToStreamAsync(type, value, stream, content, transportContext).Wait();

                writer.Write(")");
                writer.Flush();
            });
        }
        else
        {
            return base.WriteToStreamAsync(type, value, stream, content, transportContext);
        }
    }


    private bool IsJsonpRequest(out string callback)
    {
        callback = null;

        if (HttpContext.Current.Request.HttpMethod != "GET")
            return false;

        callback = HttpContext.Current.Request.QueryString[CallbackQueryParameter];

        return !string.IsNullOrEmpty(callback);
    }
}
票数 52
EN

Stack Overflow用户

发布于 2013-08-13 18:19:51

您可以像这样使用ActionFilterAttribute:

代码语言:javascript
复制
public class JsonCallbackAttribute : ActionFilterAttribute
{
    private const string CallbackQueryParameter = "callback";

    public override void OnActionExecuted(HttpActionExecutedContext context)
    {
        var callback = string.Empty;

        if (IsJsonp(out callback))
        {
            var jsonBuilder = new StringBuilder(callback);

            jsonBuilder.AppendFormat("({0})", context.Response.Content.ReadAsStringAsync().Result);

            context.Response.Content = new StringContent(jsonBuilder.ToString());
        }

        base.OnActionExecuted(context);
    }

    private bool IsJsonp(out string callback)
    {
        callback = HttpContext.Current.Request.QueryString[CallbackQueryParameter];

        return !string.IsNullOrEmpty(callback);
    }
}

然后把它放在你的行动上:

代码语言:javascript
复制
[JsonCallback]
public IEnumerable<User> User()
{
    return _user;
}
票数 21
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9421312

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档