简体   繁体   English

ASP.NET:如何在不更改浏览器中的 URL 的情况下进行重定向?

[英]ASP.NET: How to redirect without changing URL in the Browser?

Im part of a team creating a server project in ASP.NET that provides a series of services to logged in members.我是在 ASP.NET 中创建服务器项目的团队的一员,该项目为登录的成员提供一系列服务。 We separated the server into components such as for authentication.我们将服务器分成组件,例如用于身份验证。 Example of components are seen in the table below.组件示例见下表。 This way its helps manage the project in terms of testing and other benefits.通过这种方式,它有助于在测试和其他好处方面管理项目。

+-----------------+-------------------+
|    Component    |      Address      |
+-----------------+-------------------+
| Authentication  | 192.168.0.10:5001 |
| User Management | 192.168.0.10:5002 |
| Search Engine   | 192.168.0.10:5003 |
| System Settings | 192.168.0.10:5004 |
+-----------------+-------------------+

The issue we are facing is that we want to to use only one url in the browser just like in the table below.我们面临的问题是我们只想在浏览器中使用一个 url,如下表所示。 We have already matched subdirectories with their respective component .我们已经将子目录与其各自的组件相匹配。 For example, /login should redirect to Authentication component.例如, /login应该重定向到Authentication组件。 If a user has navigated to the search page and entered a search term, it should redirect from www.mysite.com/search?value=test to 192.168.0.10:5003?value=test .如果用户导航到搜索页面并输入了搜索词,它应该从www.mysite.com/search?value=test重定向到192.168.0.10:5003?value=test

+-------------------------+-------------------+
|           ULR           |     Redirect      |
+-------------------------+-------------------+
| www.mysite.com/         | 192.168.0.10:5000 |
| www.mysite.com/login    | 192.168.0.10:5001 |
| www.mysite.com/users    | 192.168.0.10:5002 |
| www.mysite.com/search   | 192.168.0.10:5003 |
| www.mysite.com/settings | 192.168.0.10:5004 |
+-------------------------+-------------------+

How to program a separate project as gateway in C# ASP.NET to intercept and receive any url path without controllers and redirect to the component without changing the URL in the browser? How to program a separate project as gateway in C# ASP.NET to intercept and receive any url path without controllers and redirect to the component without changing the URL in the browser?

you can use a middleware for handle your request:您可以使用中间件来处理您的请求:

this middleware get request and send it to other application and get that response and forward to first one.该中间件获取请求并将其发送到其他应用程序并获取该响应并转发给第一个应用程序。

just sample for idea:只是想法的样本:

  public class Startup
    {
         
        public void Configure(IApplicationBuilder app, IHostingEnvironment env)
        {
            app.Use(async (context, next) =>
            {
                if (context.Request.Path.Value.Contains("/api"))
                {     
                   
                    string BaseUrl = (env.IsDevelopment() ? "172.0.0.1:5001" : "192.168.0.10:5001") + context.Request.Path.Value + (context.Request.QueryString.HasValue ? context.Request.QueryString.Value : "");

                    var handler = new HttpClientHandler
                    {
                        //handle Ssl 
                        ClientCertificateOptions = ClientCertificateOption.Manual,
                        SslProtocols = SslProtocols.Tls12,
                        UseDefaultCredentials = true,
                        ServerCertificateCustomValidationCallback = ((sender, certificate, chain, sslPolicyErrors) => true),
                    };

                    //handle compression
                    if (handler.SupportsAutomaticDecompression)
                    {
                        handler.AutomaticDecompression = DecompressionMethods.GZip |
                                                         DecompressionMethods.Deflate;
                    }

                    //handle Ssl 
                    handler.ServerCertificateCustomValidationCallback = (message, cert, chain, errors) => true;

                    var client = new HttpClient(handler);

                    client.DefaultRequestHeaders.Clear();

                    //handle Authorization Header 
                    if (context.Request.Headers.ContainsKey("Authorization"))
                    {
                        client.DefaultRequestHeaders.TryAddWithoutValidation("Authorization", context.Request.Headers["Authorization"].ToString());
                    }
                     
                    // forward User-Agent
                    client.DefaultRequestHeaders.TryAddWithoutValidation("User-Agent", context.Request.Headers["User-Agent"].ToString());

                      

                    HttpResponseMessage response = null;
                    if (context.Request.Method == "GET")
                    {
                        response = await client.GetAsync(BaseUrl);
                    }

                    if (context.Request.Method == "POST")
                    {
                        try
                        {
                            string documentContents;
                            using (Stream receiveStream = context.Request.Body)
                            {
                                using (StreamReader readStream = new StreamReader(receiveStream, Encoding.UTF8))
                                {
                                    documentContents = readStream.ReadToEnd();
                                }
                            }

                          //  HttpContent content = new StringContent(documentContents, Encoding.UTF8, "application/json");
                            response = await client.PostAsync(BaseUrl, content);
                        }
                        catch (Exception e)
                        {
                            await context.Response.WriteAsync(e.Message, Encoding.UTF8);
                        }
                    }

                    if (response != null)
                    {
                        foreach (var header in response.Content.Headers)
                        {
                            StringValues stringValues = StringValues.Empty;
                            foreach (var values in header.Value)
                            {
                                StringValues.Concat(stringValues, values);
                            }

                            context.Response.Headers.Add(header.Key, stringValues);
                        }

                        context.Response.StatusCode = (int)response.StatusCode;

                        var body = await response.Content.ReadAsStringAsync();
                        await context.Response.WriteAsync(body, Encoding.UTF8);
                    }
                }
                else
                {
                    await next.Invoke();
                }
            });

        
        }
    }

I think you must separate base on path to separate destination.我认为你必须根据到不同目的地的路径分开。

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

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