asp.net – Owin Middleware vs ExceptionHandler vs HttpMessage
|
请任何人给我一些想法,以下三个模块在asp.net Web API 2.1中一起工作 > Owin中间件 我想要做的是开发和提供一个不变格式的json数据的web api,意味着如果实际的数据是 {"Id":1,"UserName":"abc","Email":"abc@xyz.com"}
然后我喜欢提供json {__d:{"Id":1,"Email":"abc@xyz.com"},code:200,somekey: "somevalue"}
为此,我尝试使用自定义ActionFilterAttribute,但我觉得(仍然不能确认),如果代码遇到异常,这样做不能提供类似的格式数据 请建议我最好的方向. 这是我的简短的自定义属性代码片段.还建议我是自定义属性是好的目的 [AttributeUsage(AttributeTargets.Method | AttributeTargets.Class,Inherited = true,AllowMultiple = false)]
public class ResponseNormalizationAttribute : ActionFilterAttribute
{
public override void OnActionExecuted(HttpActionExecutedContext actionExecutedContext)
{
base.OnActionExecuted(actionExecutedContext);
var response = actionExecutedContext.Response;
object contentValue;
if (response.TryGetContentValue(out contentValue))
{
var nval = new { data=contentValue,status = 200 };
var newResponse = new HttpResponseMessage { Content = new ObjectContent(nval.GetType(),nval,new JsonMediaTypeFormatter()) };
newResponse.Content.Headers.ContentType = new MediaTypeHeaderValue("application/json");
actionContext.Response = newResponse;
}
}
}
解决方法如果您不使用Owin中间件,则可以全局包装所有响应,以便使用委托处理程序返回常量格式的json数据.编写一个继承自DelegatingHandler的自定义处理程序: public class ApiResponseHandler : DelegatingHandler
{
protected override async Task<HttpResponseMessage> SendAsync(HttpRequestMessage request,CancellationToken cancellationToken)
{
var response = await base.SendAsync(request,cancellationToken);
return BuildResponse(request,response);
}
private static HttpResponseMessage BuildResponse(HttpRequestMessage request,HttpResponseMessage response)
{
object content;
string errorMessage = null;
if (response.TryGetContentValue(out content) && !response.IsSuccessStatusCode)
{
HttpError error = content as HttpError;
if (error != null)
{
content = null;
errorMessage = error.Message;
}
}
var newResponse = request.CreateResponse(response.StatusCode,new ApiResponse((int)response.StatusCode,content,errorMessage));
foreach (var header in response.Headers)
{
newResponse.Headers.Add(header.Key,header.Value);
}
return newResponse;
}
}
//ApiResponse is your constant json response
public class ApiResponse
{
public ApiResponse(int statusCode,object content,string errorMsg)
{
Code = statusCode;
Content = content;
Error = errorMsg;
Id = Guid.NewGuid().ToString();
}
public string Error { get; set; }
//your actual data is mapped to the Content property
public object Content { get; set; }
public int Code { get; private set; }
public string Id { get; set; }
}
在WebApiConfig.cs中注册处理程序: public static void Register(HttpConfiguration config)
{
// Web API routes
config.MapHttpAttributeRoutes();
...
config.MessageHandlers.Add(new ApiResponseHandler());
config.Routes.MapHttpRoute(
name: "DefaultApi",routeTemplate: "{controller}/{id}",defaults: new { id = RouteParameter.Optional }
);
...
}
我在SO中发布了一个类似的答案,但这是在.NET Core中,并被实现为一个OWIN中间件(因为DelegatingHandler在.NET Core中). How can I wrap Web API responses(in .net core) for consistency? (编辑:安卓应用网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- asp.net-mvc – Sammy.js和Knockout.js =模板没有模板?
- 如何在asp.net和C#中实现登录会话
- asp.net – 根据自己的主机Web API Windows服务验证HTTP .N
- asp.net阻止表单提交两次
- asp.net-mvc – 是否可以在MVC和Webforms之间共享母版页?
- 如何通过Asp.net WebAPI中的异常过滤器传递内容?
- asp.net – ASP MVC用户配置文件
- asp.net-mvc – 向MVC 3添加基于声明的授权
- 如何在ASP.NET中继器DataDataBound事件中访问数据源字段?
- 为什么ASP.NET MVC 3没有正确验证我的浮动?
- 在ASP.NET中下载文件的实现代码
- asp.net-mvc-4 – 如何在一个Web应用程序中最好地
- ASP.NET Repeater ItemDataBound事件中等效的Eva
- 身份验证 – 禁止ASP.NET Core中的API URL重定向
- asp.net-mvc – asp.net mvc提交时的表单集合
- asp.net-mvc – AJAX POST到MVC Controller显示3
- asp.net-mvc – 如何使用Entity Framework和Memb
- asp.net-mvc – 查看模型IEnumerable 属性返回nu
- asp-classic – 你用什么来编辑和开发经典ASP
- asp.net – 当要复制的lob数据的插入长度超过配置
