Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-core/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# ASP.NET核心使用中间件修改HTTP请求头_C#_Asp.net Core_Httprequest_Middleware_System.net.httpwebrequest - Fatal编程技术网

C# ASP.NET核心使用中间件修改HTTP请求头

C# ASP.NET核心使用中间件修改HTTP请求头,c#,asp.net-core,httprequest,middleware,system.net.httpwebrequest,C#,Asp.net Core,Httprequest,Middleware,System.net.httpwebrequest,我需要做的就是将HTTP头从“Keep-alive”修改为小写的“Keep-alive” 我写了这堂课 public class PreRequestModifications { private readonly RequestDelegate _next; public PreRequestModifications(RequestDelegate next) { _next = next; } public async Task

我需要做的就是将HTTP头从“Keep-alive”修改为小写的“Keep-alive”

我写了这堂课

public class PreRequestModifications
{

    private readonly RequestDelegate _next;

    public PreRequestModifications(RequestDelegate next)
    {
        _next = next;
    }

    public async Task Invoke(HttpContext context)
    {
        // Does not get called when making an HTTPWebRequest.   
        await _next.Invoke(context);              
    }
}
并在启动时注册

 public void Configure(IApplicationBuilder app, IHostingEnvironment env)
 {    
     app.UseMiddleware<PreRequestModifications>();
 }
public void配置(IApplicationBuilder应用程序,IHostingEnvironment环境)
{    
app.UseMiddleware();
}

但是当我执行wait httpWebRequest.GetResponseAsync()时,
Invoke
方法没有被调用

因此,当发出请求和返回响应时,中间件会受到影响。实际上,这意味着您可以像这样两次遍历Invoke方法:

public async Task Invoke(HttpContext context)
{
  ModifyRequest(context);
  await _next(context);
  ModifyResponse(context);
}
因此,您可以在
ModifyResponse
方法中修改响应

微软的文档将使其更加清晰:


希望这会有所帮助。

因此,当发出请求和返回响应时,中间件会受到影响。实际上,这意味着您可以像这样两次遍历Invoke方法:

public async Task Invoke(HttpContext context)
{
  ModifyRequest(context);
  await _next(context);
  ModifyResponse(context);
}
因此,您可以在
ModifyResponse
方法中修改响应

微软的文档将使其更加清晰:


希望这会有所帮助。

您是否在DI系统中注册了中间件?您需要在
启动
类,
配置服务
方法中执行此操作:

services.AddScoped<IMiddleware, SomeMiddleware>();
services.addScope();

您是否在DI系统中注册了中间件?您需要在
启动
类,
配置服务
方法中执行此操作:

services.AddScoped<IMiddleware, SomeMiddleware>();
services.addScope();

中间件处理web服务器的传入请求。这是否用于从您的服务器代码到另一台服务器的传出http请求?如果没有,您能否明确说明您正试图修改哪个标头。@sellotape是的,我需要修改传出请求。这与您当时提到的中间件无关。假设您使用的是
HttpWebRequest
,则该头在发送之前添加,没有可以用来更改它的挂钩。您可以尝试设置
。KeepAlive=false,应该停止添加标头,然后在发送之前添加您自己的标头,但是。。。与此标题相比,keep-alive连接的幕后活动更多。它还回避了一个问题:为什么您呼叫的服务器需要它;所有HTTP规范都引用“保持活动”。仅供参考。KeepAlive=false;+添加my own将导致组合头连接:保持活动,close@realPro-是的,如果
KeepAlive
为false,它将添加“close”。参见源代码-第5047行。看来你对此无能为力。我会向您呼叫的服务器的提供商投诉。该中间件处理对您的web服务器的传入请求。这是否用于从您的服务器代码到另一台服务器的传出http请求?如果没有,您能否明确说明您正试图修改哪个标头。@sellotape是的,我需要修改传出请求。这与您当时提到的中间件无关。假设您使用的是
HttpWebRequest
,则该头在发送之前添加,没有可以用来更改它的挂钩。您可以尝试设置
。KeepAlive=false,应该停止添加标头,然后在发送之前添加您自己的标头,但是。。。与此标题相比,keep-alive连接的幕后活动更多。它还回避了一个问题:为什么您呼叫的服务器需要它;所有HTTP规范都引用“保持活动”。仅供参考。KeepAlive=false;+添加my own将导致组合头连接:保持活动,close@realPro-是的,如果
KeepAlive
为false,它将添加“close”。参见源代码-第5047行。看来你对此无能为力。我会向您正在调用的服务器的提供商投诉。但我的问题是调用没有被调用。嗯。我以前在一个共享项目中遇到过这个问题。是其他人的中间件没有调用
next
,所以它在管道中短路了中间件。但我的问题是调用没有被调用。嗯。我以前在一个共享项目中遇到过这个问题。是其他人的中间件没有调用
next
,因此它最终导致中间件在管道中短路。