我正在使用Web在ASP.MVC MVC4中创建一组新的服务。到目前为止,它还不错。我已经创建了服务并使其正常工作,现在我正尝试使用JQuery来使用它。我可以使用Fiddler取回JSON字符串,这看起来没问题,但因为服务存在于单独的站点上,所以尝试调用它时会出现JQuery错误,并显示“不允许”。因此,这显然是我需要使用JSONP的情况。
我知道Web API是新的,但我希望有人能帮助我。
如何使用JSONP调用Web API方法?
发布于 2012-02-24 06:10:49
在问了这个问题之后,我终于找到了我需要的东西,所以我回答了它。
我遇到了这个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);
}
})
它似乎工作得很好。
发布于 2012-06-03 23:37:29
以下是用于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);
}
}
发布于 2013-08-13 18:19:51
您可以像这样使用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;
}
https://stackoverflow.com/questions/9421312
复制相似问题