带有ASP.NET Web API的JSONP
我正在使用Web API在ASP.MVC MVC 4中创建一组新的服务。 到目前为止,这很好。 我创建了这个服务并且让它得以运行,现在我正试图使用JQuery来使用它。 我可以使用Fiddler取回JSON字符串,它似乎没问题,但是由于该服务存在于单独的站点上,因此尝试使用“不允许”的JQuery错误来调用它。 所以,这显然是我需要使用JSONP的情况。
我知道Web API是新的,但我希望有人能帮助我。
如何使用JSONP调用Web API方法?
问了这个问题后,我终于找到了我需要的东西,所以我正在回答它。
我碰到了这个JsonpMediaTypeFormatter。 将其添加到global.asax的Application_Start
中:
var config = GlobalConfiguration.Configuration;
config.Formatters.Insert(0, new JsonpMediaTypeFormatter());
而且您可以使用如下所示的JQuery AJAX调用:
$.ajax({
url: 'http://myurl.com',
type: 'GET',
dataType: 'jsonp',
success: function (data) {
alert(data.MyProperty);
}
})
它似乎工作得很好。
以下是适用于WebAPI RC的JsonpMediaTypeFormatter的更新版本:
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);
}
}
你可以像这样使用ActionFilterAttribute:
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);
}
}
然后把它放在你的动作上:
[JsonCallback]
public IEnumerable<User> User()
{
return _user;
}
链接地址: http://www.djcxy.com/p/20553.html