- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
请任何人告诉我以下三个模块如何在 asp.net Web API 2.1 中协同工作
{"Id":1,"UserName":"abc","Email":"abc@xyz.com"}
{__d:{"Id":1,"UserName":"abc","Email":"abc@xyz.com"}, code:200, somekey: "somevalue"}
[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 中间件,您可以全局包装所有响应,以便使用委托(delegate)处理程序返回您的常量格式 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 }
);
...
}
关于asp.net - Owin 中间件 vs ExceptionHandler vs HttpMessageHandler (DelegatingHandler),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24156853/
如何对自定义 DelegatingHandler 进行单元测试?我有以下内容,但它提示未设置 innerHandler。 var httpRequestMessage = new HttpReques
我正在尝试记录我的 Web API 项目的 HTTP 响应 header 。 本项目采用VS2012、.NET 4.5和ASP.NET MVC 4开发。 我写了一个 DelegatingHandler
我正在尝试对 DelegateHandler 的实现进行单元测试。我的简化实现: public class FooHandler : DelegatingHandler { prote
我正在尝试对 DelegateHandler 的实现进行单元测试。我的简化实现: public class FooHandler : DelegatingHandler { prote
在 ASP.NET Core 2.1 应用程序中,我使用 HttpClient 发出 REST 请求。我正在使用 DelegatingHandler 来定义一些常见行为。注册我在这里: private
我是依赖注入(inject)的新手,但对 Ninject 和 Ninject.Extensions.Logging 到 [Inject] 我的 ILogger 很满意 无论我需要什么。 但是一些Del
我目前正在使用几个委托(delegate)处理程序(派生自 DelegatingHandler 的类)在发送请求之前处理请求,例如验证签名等。这一切都非常好,因为我不' 必须对所有调用重复签名验证(例
我有代码将命名的 HttpClient 添加到 ServiceCollection 并将 DelegatingHandler 添加到客户端。示例代码: public class MyDelegatin
我正在尝试对 DelegatingHandler 使用依赖注入(inject)包含 2 个接口(interface)和 1 个字符串。 public class MessageHandler : De
DelegatingHandler继承自 HttpMessageHandler .但是,我不明白其中的区别,因为您必须实现相同的方法,SendAsync使两者都起作用。 这两个处理程序有什么区别?我应
我有以下代码,在转发到我的 localhost:1671 时工作正常: protected override async System.Threading.Tasks.Task SendAsync(H
我在类库中有一个自定义的 DelegatingHandler,我需要用 Autofac 注册它。 webapi 宿主解决了它对运行时的依赖,因此宿主没有对该库的引用。 public class Loc
在我的应用程序中,我们从客户端发送大小适中的数据包并接收大小适中的响应,因此我想在向上和返回的过程中实现一些压缩。 在回来的路上它很好,因为我可以依靠 IIS 的动态压缩来为我做这件事,但在回来的路上
在WebAPI自托管应用程序中,DelegatingHandler的SendAsync()方法和ApiController的任何方法是否总是在同一线程上执行? 使用[ThreadStatic]变量将R
我想知道是否可以在 DelegatingHandler 的 SendAsync 方法中访问正在执行(或即将执行)的 Controller ?我似乎不知道如何访问它,我认为这是因为它在 Controll
我正在尝试了解 Web API Http 管道的工作原理! 在我的 Web API 项目中,我使用以下技术来记录/处理异常: ExceptionHandler -> 在全局级别处理异常 Excepti
我正在尝试在 ASP.NET WebAPI 项目中记录整个传入请求和传出响应。虽然我同意 DelegatingHandler,但我的雇主坚持使用 HttpModule。您如何向她解释为什么我们应该使用
我有一个 MVC/Web API 混合项目,我添加了一个简单的 DelegatingHandler 实现来包装 API 响应。这很好用,但处理程序也被调用以请求 MVC Controller 。我的理
我有一个 Web API,它是一个非常薄的基础架构,只包含两个 DelegatingHandler 实现,它们将传入消息分派(dispatch)到业务层中定义的消息处理程序实现。这意味着没有 Cont
我正在阅读文章并检查示例,我发现 Owin 中间件的使用方式与 WebAPI DelegatingHandler 相同:记录传入请求、验证 header 等。 我唯一的理解是 Owin 中间件在管道中
我是一名优秀的程序员,十分优秀!