简体   繁体   English

.NET核心反向代理中间件和signalR

[英].NET Core reverse proxy middleware and signalR

I need to do a reverse proxy middleware in ASP.NET Core.我需要在ASP.NET Core做一个反向代理中间件。 I have something like this.我有这样的东西。 But it doesn't work with SignalR.但它不适用于 SignalR。

Reverse proxy has address 192.168.187.72:5000;反向代理的地址为 192.168.187.72:5000; SignalR 192.168.187.62:5000. SignalR 192.168.187.62:5000。 Client connects to proxy, proxy changes the url to SignalR hub url, but in client I always get this error:客户端连接到代理,代理将 url 更改为 SignalR 集线器 url,但在客户端我总是得到这个错误:

The server disconnected before the handshake could be started服务器在握手开始之前断开连接

Code:代码:

public ReverseProxyMiddleware(RequestDelegate nextMiddleware,ILogger<ReverseProxyMiddleware> logger)
{
    _nextMiddleware = nextMiddleware;
    _logger = logger;
}

public async Task Invoke(HttpContext context)
{
     var targetUri = BuildTargetUri(context.Request);
       
     if (targetUri != null)
     {
         var targetRequestMessage = CreateTargetMessage(context, targetUri);
           
         using (var responseMessage = await _httpClient.SendAsync(targetRequestMessage, HttpCompletionOption.ResponseHeadersRead, context.RequestAborted))
         {
             context.Response.StatusCode = (int)responseMessage.StatusCode;
                
             CopyFromTargetResponseHeaders(context, responseMessage);
             await responseMessage.Content.CopyToAsync(context.Response.Body);
         }

         return;
    }

    await _nextMiddleware(context);
}

private HttpRequestMessage CreateTargetMessage(HttpContext context, Uri targetUri)
{
    var requestMessage = new HttpRequestMessage();

    CopyFromOriginalRequestContentAndHeaders(context, requestMessage);

    requestMessage.RequestUri = targetUri;
    requestMessage.Headers.Host = targetUri.Host;
    requestMessage.Method = GetMethod(context.Request.Method);

    return requestMessage;
}

private void CopyFromOriginalRequestContentAndHeaders(HttpContext context, HttpRequestMessage requestMessage)
{
    var requestMethod = context.Request.Method;
       
    var streamContent = new StreamContent(context.Request.Body);
    requestMessage.Content = streamContent;

    foreach (var header in context.Request.Headers)
    {
        requestMessage.Content?.Headers.TryAddWithoutValidation(header.Key, header.Value.ToArray());
    }
}

private void CopyFromTargetResponseHeaders(HttpContext context, HttpResponseMessage responseMessage)
{
    foreach (var header in responseMessage.Headers)
    {
        context.Response.Headers[header.Key] = header.Value.ToArray();
    }

    foreach (var header in responseMessage.Content.Headers)
    {
        context.Response.Headers[header.Key] = header.Value.ToArray();
    }

    context.Response.Headers.Remove("transfer-encoding");
}

private static HttpMethod GetMethod(string method)
{
    if (HttpMethods.IsDelete(method)) return HttpMethod.Delete;
    if (HttpMethods.IsGet(method)) return HttpMethod.Get;
    if (HttpMethods.IsHead(method)) return HttpMethod.Head;
    if (HttpMethods.IsOptions(method)) return HttpMethod.Options;
    if (HttpMethods.IsPost(method)) return HttpMethod.Post;
    if (HttpMethods.IsPut(method)) return HttpMethod.Put;
    if (HttpMethods.IsTrace(method)) return HttpMethod.Trace;

    return new HttpMethod(method);
}

private Uri BuildTargetUri(HttpRequest request)
{
    Uri targetUri = null;
    StringValues clientId = string.Empty;

    targetUri = new Uri($"http://192.168.187.62:5000{request.Path}{request.QueryString}");

    _logger.LogInformation($"Request URL {request.Host + request.Path + request.QueryString} Target URL {targetUri.ToString()}");

    return targetUri;
}

Are you sure you want to create such functionality manually?您确定要手动创建此类功能吗?

There are many great libraries for reverse proxying, Microsoft has a new project called YARP ( https://microsoft.github.io/reverse-proxy/ ) which is an open source reverse proxy told to be high performance and highly customizable.有很多很棒的反向代理库,Microsoft 有一个名为 YARP ( https://microsoft.github.io/reverse-proxy/ ) 的新项目,这是一个开源反向代理,据说具有高性能和高度可定制性。

If you like I can show you a sample how you can use yarp in an ASP.NET Core app.如果您愿意,我可以向您展示如何在 ASP.NET Core 应用程序中使用 yarp 的示例。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM