关于JS跨域通过put方式请求WebApi的问题,实现DelegatingHandler之后,如何得到Action执行的结果,并返回输出到HttpResponseMessage

weixin_38051999 2017-03-17 01:42:25
场景如下,Js发起跨域请求调用WebApi,通过JsonP和配置站点的Access-Control-Allow-Origin方式,Js通过get和post调用webapi都没有问题。但是对于put和delete方式的调用,无法得到正确的响应,返回405Not
Allowed Methods。查看浏览器请求信息,看到Request Method:OPTIONS。网上搜索资料之后,按照一些帖子的建议,在WebConfig下配置对应的Access-Control信息之后,再试,也还是没有正确请求并得到执行.
后来看到帖子,有说通过实现DelegatingHandler的方式来处理,经测试这种方式确实可以得到正确的响应,并返回200OK的状态。
但是这种方式,并没有返回请求的路由对应的Action执行的结果到Response,而只是返回的自定义的response。
public class CorsMessageHandler : DelegatingHandler
{
const string Origin = "Origin";
const string AccessControlRequestMethod = "Access-Control-Request-Method";
const string AccessControlRequestHeaders = "Access-Control-Request-Headers";
const string AccessControlAllowOrigin = "Access-Control-Allow-Origin";
const string AccessControlAllowMethods = "Access-Control-Allow-Methods";
const string AccessControlAllowHeaders = "Access-Control-Allow-Headers";

protected override Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
{
bool isCorsRequest = request.Headers.Contains(Origin);
bool isPreflightRequest = request.Method == HttpMethod.Options;
if (isCorsRequest)
{
if (isPreflightRequest)
{
return Task.Factory.StartNew<HttpResponseMessage>(() =>
{
HttpResponseMessage response = new HttpResponseMessage(HttpStatusCode.OK);
response.Headers.Add(AccessControlAllowOrigin, request.Headers.GetValues(Origin).First());

string accessControlRequestMethod = request.Headers.GetValues(AccessControlRequestMethod).FirstOrDefault();
if (accessControlRequestMethod != null)
{
response.Headers.Add(AccessControlAllowMethods, accessControlRequestMethod);
}

string requestedHeaders = string.Join(", ", request.Headers.GetValues(AccessControlRequestHeaders));
if (!string.IsNullOrEmpty(requestedHeaders))
{
response.Headers.Add(AccessControlAllowHeaders, requestedHeaders);
}

return response;//这里返回的response,除了header部分有内容,content里面没有任何的返回。如何得到Put类型的Action执行的结果
}, cancellationToken);
}
else
{
return base.SendAsync(request, cancellationToken).ContinueWith<HttpResponseMessage>(t =>
{
HttpResponseMessage resp = t.Result;
resp.Headers.Add(AccessControlAllowOrigin, request.Headers.GetValues(Origin).First());
return resp;
});
}
}
else
{
return base.SendAsync(request, cancellationToken);
}
}
}查看浏览器下的状态如下:Request URL:http://localhost:92/api/comment/100000003?deviceid=134134134134&devicetype=iphone134Request Method:OPTIONSStatus Code:<label class="resource-status-image" is="dt-icon-label" style="min-width:0px;min-height:0px;box-sizing:border-box;flex:0 0 auto;"></label>200 OKRemote Address:[::1]:92Response Headers:Access-Control-Allow-Methods:PUTAccess-Control-Allow-Origin:*Access-Control-Allow-Origin:http://localhost:58780Cache-Control:no-cacheContent-Length:0Date:Fri, 17 Mar 2017 01:22:46 GMTExpires:-1Pragma:no-cacheServer:Microsoft-IIS/10.0X-AspNet-Version:4.0.30319X-Powered-By:ASP.NETRequest Headers:Accept:*/*Accept-Encoding:gzip, deflate, sdch, brAccept-Language:zh-CN,zh;q=0.8Access-Control-Request-Headers:Access-Control-Request-Method:PUTCache-Control:no-cacheConnection:keep-aliveHost:localhost:92Origin:http://localhost:58780Pragma:no-cacheReferer:http://localhost:58780/Feature/Yiyuzheng在CorsMessageHandler的SendAsync里,自定义输出Response.Content之后,可以在浏览器得到返回。response.Content = new StringContent("OK");但是问题是,跨域请求的地址指向的是一个Action,我如何得到Action执行之后的消息体呢?
...全文
25 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复

476

社区成员

发帖
与我相关
我的任务
社区描述
其他技术讨论专区
其他 技术论坛(原bbs)
社区管理员
  • 其他技术讨论专区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧