簡體   English   中英

如何更改基礎 url 的 Swagger in.core 取決於請求

[英]How to change base url of Swagger in .core depend on the request

在舊版本的 Swagger(.Net 框架)中,我使用了這個 function 來更改 URL:

RootUrl(req => ComputeHostAsSeenByOriginalClient(req))

實際上我從請求中計算了基礎 URL (我的應用程序位於負載均衡器后面)

new.core 的方式是使用這個RoutePrefix

問題:
RoutePrefixProperty而不是Action ,所以我沒有HttpRequestMessage

這是ComputeHostAsSeenByOriginalClient完整代碼:

   public static string ComputeHostAsSeenByOriginalClient(HttpRequestMessage req)
        {
            var authority = req.RequestUri.Authority;
            var scheme = req.RequestUri.Scheme;



            if (req.Headers.Contains("X-Forwarded-Host"))
            {
                //we are behind a reverse proxy, use the host that was used by the client
                var xForwardedHost = req.Headers.GetValues("X-Forwarded-Host").First();
                //when multiple apache httpd are chained, each proxy append to the header 
                //with a comma (see //https://httpd.apache.org/docs/2.4/mod/mod_proxy.html#x-headers).
                //so we need to take only the first host because it is the host that was 
                //requested by the original client.
                //note that other reverse proxies may behave differently but 
                //we are not taking care of them...
                var firstForwardedHost = xForwardedHost.Split(',')[0];
                authority = firstForwardedHost;
            }



            if (req.Headers.Contains("X-Forwarded-Proto"))
            {
                //now that we have the host, we also need to determine the protocol used by the 
                //original client.
                //if present, we are using the de facto standard header X-Forwarded-Proto
                //otherwise, we fallback to http
                //note that this is extremely brittle, either because the first proxy 
                //can "forget" to set the header or because another proxy can rewrite it...
                var xForwardedProto = req.Headers.GetValues("X-Forwarded-Proto").First();
                if (xForwardedProto.IndexOf(",") != -1)
                {
                    //when multiple apache, X-Forwarded-Proto is also multiple ...
                    xForwardedProto = xForwardedProto.Split(',')[0];
                }
                scheme = xForwardedProto;
            }
            //no reverse proxy mean we can directly use the RequestUri
            return scheme + "://" + authority;
        }

知道如何解決這個問題嗎?

嘗試使用this.Request 您可以從Controller

        public string ComputeHostAsSeenByOriginalClient()
        {
            var req = this.Request;
            var scheme = req.Scheme;
            var authority = this.Request.Host.Value.ToString();

            if (req.Headers.ContainsKey("X-Forwarded-Host"))
            {
                //we are behind a reverse proxy, use the host that was used by the client
                StringValues xForwardedHost = "";
                if (req.Headers.TryGetValue("X-Forwarded-Host", out xForwardedHost))
                {
                    //when multiple apache httpd are chained, each proxy append to the header 
                    //with a comma (see //https://httpd.apache.org/docs/2.4/mod/mod_proxy.html#x-headers).
                    //so we need to take only the first host because it is the host that was 
                    //requested by the original client.
                    //note that other reverse proxies may behave differently but 
                    //we are not taking care of them...
                    var firstForwardedHost = xForwardedHost.First().ToString().Split(',')[0];
                    authority = firstForwardedHost;
                }
            }

            if (req.Headers.ContainsKey("X-Forwarded-Proto"))
            {
                //now that we have the host, we also need to determine the protocol used by the 
                //original client.
                //if present, we are using the de facto standard header X-Forwarded-Proto
                //otherwise, we fallback to http
                //note that this is extremely brittle, either because the first proxy 
                //can "forget" to set the header or because another proxy can rewrite it...
                StringValues xForwardedProto = "";
                if (req.Headers.TryGetValue("X-Forwarded-Proto", out xForwardedProto))
                { 
                    if (xForwardedProto.First().ToString().IndexOf(",") != -1)
                    {
                        //when multiple apache, X-Forwarded-Proto is also multiple ...
                        xForwardedProto = xForwardedProto.First().ToString().Split(',')[0];
                    }
                    scheme = xForwardedProto;
                }
            }
            //no reverse proxy mean we can directly use the RequestUri
            return scheme + "://" + authority;

        }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM