C# Owin中间件中的覆盖响应体
我正在使用一个Owin中间件类。其目的是在检测到401、403或405 HTTP状态代码时覆盖响应主体,并用JSON对象替换主体。这是我目前的方法:C# Owin中间件中的覆盖响应体,c#,asp.net-web-api,owin,C#,Asp.net Web Api,Owin,我正在使用一个Owin中间件类。其目的是在检测到401、403或405 HTTP状态代码时覆盖响应主体,并用JSON对象替换主体。这是我目前的方法: public override async Task Invoke(IOwinContext context) { await Next.Invoke(context); if (context.Response.StatusCode == 401 || context.Respon
public override async Task Invoke(IOwinContext context)
{
await Next.Invoke(context);
if (context.Response.StatusCode == 401 || context.Response.StatusCode == 403 || context.Response.StatusCode == 405)
{
var owinResponse = context.Response;
var owinResponseStream = owinResponse.Body;
var responseBuffer = new MemoryStream();
owinResponse.Body = responseBuffer;
string message;
switch (context.Response.StatusCode)
{
case 401:
message = "unauthorized request";
break;
case 403:
message = "forbidden request";
break;
default:
message = "request not allowed";
break;
}
var newResponse = new ResponseMessage<string>
{
IsError = true,
StatusCode = (HttpStatusCode) Enum.Parse(typeof(HttpStatusCode), context.Response.StatusCode.ToString()),
Data = null,
Message = message
};
var customResponseBody = new StringContent(JsonConvert.SerializeObject(newResponse));
var customResponseStream = await customResponseBody.ReadAsStreamAsync();
await customResponseStream.CopyToAsync(owinResponseStream);
owinResponse.ContentType = "application/json";
owinResponse.ContentLength = customResponseStream.Length;
owinResponse.StatusCode = 200;
owinResponse.Body = owinResponseStream;
}
}
而不是:
{"IsError":true,"StatusCode":401,"Data":null,"Message":"unauthorized request"}
我确信这与我给回复机构写信的方式有关,但到目前为止还没有解决这个问题
如有任何建议,将不胜感激
谢谢当您第一次将响应主体设置为内存流时,光标(当前位置)将移动到它的末尾<代码>owinResponse.Body=响应缓冲区代码> ,因此,我们得到了
{“message”:“此请求的授权已被拒绝”。}
存储,光标指向末尾
同样,在方法的末尾,编写新的响应owinResponse.Body=owinResponseStream代码>其中包含消息<代码>{“iError”:true,“StatusCode”:401,“Data”:null,“message”:“unauthorized request”}
由于当前位置指向流的末尾,因此它将追加
尝试删除第一组正文
owinResponse.body=responseBuffer代码>因为您不需要原始响应消息。因为您在之后编写下面的代码,等待下一步。调用(上下文)代码>
这是错误的
下一个代码可以根据您的需要工作:
public override async Task Invoke(IOwinContext context)
{
var owinResponse = context.Response;
var owinResponseStream = owinResponse.Body;
var responseBuffer = new MemoryStream();
owinResponse.Body = responseBuffer;
await Next.Invoke(context);
if (context.Response.StatusCode == 401 || context.Response.StatusCode == 403 || context.Response.StatusCode == 405)
{
string message;
switch (context.Response.StatusCode)
{
case 401:
message = "unauthorized request";
break;
case 403:
message = "forbidden request";
break;
default:
message = "request not allowed";
break;
}
var newResponse = new ResponseMessage<string>
{
IsError = true,
StatusCode = (HttpStatusCode) Enum.Parse(typeof(HttpStatusCode), context.Response.StatusCode.ToString()),
Data = null,
Message = message
};
var customResponseBody = new StringContent(JsonConvert.SerializeObject(newResponse));
var customResponseStream = await customResponseBody.ReadAsStreamAsync();
await customResponseStream.CopyToAsync(owinResponseStream);
owinResponse.ContentType = "application/json";
owinResponse.ContentLength = customResponseStream.Length;
owinResponse.StatusCode = 200;
owinResponse.Body = owinResponseStream;
}
}
公共重写异步任务调用(IOwinContext上下文)
{
var owinResponse=context.Response;
var owinResponseStream=owinResponse.Body;
var responseBuffer=newmemoryStream();
owinResponse.Body=响应缓冲区;
等待下一步。调用(上下文);
if(context.Response.StatusCode==401 | | context.Response.StatusCode==403 | | context.Response.StatusCode==405)
{
字符串消息;
开关(context.Response.StatusCode)
{
案例401:
message=“未经授权的请求”;
打破
案例403:
message=“禁止请求”;
打破
违约:
message=“不允许请求”;
打破
}
var newResponse=新响应消息
{
IsError=true,
StatusCode=(HttpStatusCode)Enum.Parse(typeof(HttpStatusCode),context.Response.StatusCode.ToString(),
数据=空,
消息=消息
};
var customResponseBody=newstringcontent(JsonConvert.SerializeObject(newResponse));
var customResponseStream=等待customResponseBody.ReadAsStreamAsync();
等待customResponseStream.CopyToAsync(owinResponseStream);
owinResponse.ContentType=“应用程序/json”;
owinResponse.ContentLength=customResponseStream.Length;
owinResponse.StatusCode=200;
owinResponse.Body=owinResponseStream;
}
}
await Next.Invoke(context);
if (context.Response.StatusCode == 401 || context.Response.StatusCode == 403 || context.Response.StatusCode == 405)
{
var owinResponse = context.Response;
var owinResponseStream = owinResponse.Body;
var responseBuffer = new MemoryStream();
owinResponse.Body = responseBuffer;
public override async Task Invoke(IOwinContext context)
{
var owinResponse = context.Response;
var owinResponseStream = owinResponse.Body;
var responseBuffer = new MemoryStream();
owinResponse.Body = responseBuffer;
await Next.Invoke(context);
if (context.Response.StatusCode == 401 || context.Response.StatusCode == 403 || context.Response.StatusCode == 405)
{
string message;
switch (context.Response.StatusCode)
{
case 401:
message = "unauthorized request";
break;
case 403:
message = "forbidden request";
break;
default:
message = "request not allowed";
break;
}
var newResponse = new ResponseMessage<string>
{
IsError = true,
StatusCode = (HttpStatusCode) Enum.Parse(typeof(HttpStatusCode), context.Response.StatusCode.ToString()),
Data = null,
Message = message
};
var customResponseBody = new StringContent(JsonConvert.SerializeObject(newResponse));
var customResponseStream = await customResponseBody.ReadAsStreamAsync();
await customResponseStream.CopyToAsync(owinResponseStream);
owinResponse.ContentType = "application/json";
owinResponse.ContentLength = customResponseStream.Length;
owinResponse.StatusCode = 200;
owinResponse.Body = owinResponseStream;
}
}