Jquery Web服务没有在JSONP回调中包装JSON?
我试图使.NETMVCWebAPI返回JSONP。我引用了JsonpMediaTypeFormatter,基于它实现了一个JsonFormatter,并在我的应用程序_Start()函数中注册了它。。。而带有“&callback=?”的客户端json调用仍然不会使用jsonp回调包装返回。。。我错过什么了吗 我试着在formatter类中设置一个断点,它似乎从未被调用过 代码位: 格式化程序:Jquery Web服务没有在JSONP回调中包装JSON?,jquery,ajax,asp.net-web-api,callback,jsonp,Jquery,Ajax,Asp.net Web Api,Callback,Jsonp,我试图使.NETMVCWebAPI返回JSONP。我引用了JsonpMediaTypeFormatter,基于它实现了一个JsonFormatter,并在我的应用程序_Start()函数中注册了它。。。而带有“&callback=?”的客户端json调用仍然不会使用jsonp回调包装返回。。。我错过什么了吗 我试着在formatter类中设置一个断点,它似乎从未被调用过 代码位: 格式化程序: /// <summary> /// Handles JsonP requests
/// <summary>
/// Handles JsonP requests when requests are fired with text/javascript
/// </summary>
public class JsonpFormatter : JsonMediaTypeFormatter
{
public JsonpFormatter()
{
SupportedMediaTypes.Add(new MediaTypeHeaderValue("application/json"));
SupportedMediaTypes.Add(new MediaTypeHeaderValue("text/javascript"));
JsonpParameterName = "callback";
}
/// <summary>
/// Name of the query string parameter to look for
/// the jsonp function name
/// </summary>
public string JsonpParameterName { get; set; }
/// <summary>
/// Captured name of the Jsonp function that the JSON call
/// is wrapped in. Set in GetPerRequestFormatter Instance
/// </summary>
private string JsonpCallbackFunction;
public override bool CanWriteType(Type type)
{
return true;
}
/// <summary>
/// Override this method to capture the Request object
/// </summary>
/// <param name="type"></param>
/// <param name="request"></param>
/// <param name="mediaType"></param>
/// <returns></returns>
public override MediaTypeFormatter GetPerRequestFormatterInstance(Type type, System.Net.Http.HttpRequestMessage request, MediaTypeHeaderValue mediaType)
{
var formatter = new JsonpFormatter()
{
JsonpCallbackFunction = GetJsonCallbackFunction(request)
};
// this doesn't work unfortunately
//formatter.SerializerSettings = GlobalConfiguration.Configuration.Formatters.JsonFormatter.SerializerSettings;
// You have to reapply any JSON.NET default serializer Customizations here
formatter.SerializerSettings.Converters.Add(new StringEnumConverter());
formatter.SerializerSettings.Formatting = Newtonsoft.Json.Formatting.Indented;
return formatter;
}
public override Task WriteToStreamAsync(Type type, object value,
Stream stream,
HttpContent content,
TransportContext transportContext)
{
if (string.IsNullOrEmpty(JsonpCallbackFunction))
return base.WriteToStreamAsync(type, value, stream, content, transportContext);
StreamWriter writer = null;
// write the pre-amble
try
{
writer = new StreamWriter(stream);
writer.Write(JsonpCallbackFunction + "(");
writer.Flush();
}
catch (Exception ex)
{
try
{
if (writer != null)
writer.Dispose();
}
catch { }
var tcs = new TaskCompletionSource<object>();
tcs.SetException(ex);
return tcs.Task;
}
return base.WriteToStreamAsync(type, value, stream, content, transportContext)
.ContinueWith(innerTask =>
{
if (innerTask.Status == TaskStatus.RanToCompletion)
{
writer.Write(")");
writer.Flush();
}
}, TaskContinuationOptions.ExecuteSynchronously)
.ContinueWith(innerTask =>
{
writer.Dispose();
return innerTask;
}, TaskContinuationOptions.ExecuteSynchronously)
.Unwrap();
}
/// <summary>
/// Retrieves the Jsonp Callback function
/// from the query string
/// </summary>
/// <returns></returns>
private string GetJsonCallbackFunction(HttpRequestMessage request)
{
if (request.Method != HttpMethod.Get)
return null;
var query = HttpUtility.ParseQueryString(request.RequestUri.Query);
var queryVal = query[this.JsonpParameterName];
if (string.IsNullOrEmpty(queryVal))
return null;
return queryVal;
}
}
尝试使用nugget包WebApiContrib.Formatting.Jsonp Jsonp formatter,在应用程序启动时这样注册它
GlobalConfiguration.Configuration.AddJsonpFormatter();
我刚刚创建了一个MCV4项目,用于我正在处理和需要的东西,添加了一个api控制器,可以对它进行JSONP调用。项目地点如下:
你得到了什么?@JonathanM它返回了一个错误“[回调函数]未调用”。响应文本是纯JSON对象,未包装。
GlobalConfiguration.Configuration.AddJsonpFormatter();