webapi之难用,之前讨论过,现在看看,如果一定要用,又要可以通过jquery跨域访问,该怎么办。
网上搜下,似乎没有太完美的方案,我们自己想想吧。
受网上方法启发,考虑自己写个MessageHandler,重写SendAsync方法只是这个类的处理过程,跟网上的完全不同。代码如下:
public class MessageHandler : DelegatingHandler
{
protected override Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
{
//var Request = HttpContext.Current.Request;
//string callbackFunc = Request.QueryString["jsoncallback"];
string callbackFunc = request.GetQueryNameValuePairs().FirstOrDefault(item => item.Key == "jsoncallback").Value;
if (callbackFunc == null)
{
return base.SendAsync(request, cancellationToken);
}
else
{
return base.SendAsync(request, cancellationToken).ContinueWith<HttpResponseMessage>(t =>
{
var response = t.Result;
if (response.IsSuccessStatusCode)
{
response.Content = new StringContent(
response.Content.ReadAsStringAsync()
.ContinueWith<string>(tin =>
{
StringBuilder sb = new StringBuilder();
sb.Append(callbackFunc);
sb.Append("(");
sb.Append(tin.Result);
sb.Append(")");
return sb.ToString();
})
.Result);
return response;
}
else
{
return response;
}
});
}
}
}
其中,
//var Request = HttpContext.Current.Request;
//string callbackFunc = Request.QueryString["jsoncallback"];
和
string callbackFunc = request.GetQueryNameValuePairs().FirstOrDefault(item => item.Key == "jsoncallback").Value;
可以达到完全相同的效果。
这时,只需在App_Start/WebApiConfig.cs里,Register方法中添加
config.MessageHandlers.Add(new MessageHandler());
就可以了。
关于MessageHandler的知识,请参考http://www.cnblogs.com/r01cn/archive/2012/12/07/2807059.html