C# Owin中间件中的覆盖响应体

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

我正在使用一个Owin中间件类。其目的是在检测到401、403或405 HTTP状态代码时覆盖响应主体,并用JSON对象替换主体。这是我目前的方法:

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;
            }

        }