c# - ASP.NET:如何在不更改浏览器中的 URL 的情况下进行重定向?
问题描述
我是在 ASP.NET 中创建服务器项目的团队的一员,该项目为登录的成员提供一系列服务。我们将服务器分成组件,例如用于身份验证。组件示例见下表。通过这种方式,它有助于在测试和其他好处方面管理项目。
+-----------------+-------------------+
| 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 |
+-----------------+-------------------+
我们面临的问题是我们只想在浏览器中使用一个 url,如下表所示。我们已经将子目录与其各自的组件相匹配。例如,/login
应该重定向到Authentication
组件。如果用户导航到搜索页面并输入了搜索词,它应该从 重定向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 |
+-------------------------+-------------------+
如何在 C# ASP.NET 中将单独的项目编程为网关,以在没有控制器的情况下拦截和接收任何 url 路径并重定向到组件而不更改浏览器中的 URL?
解决方案
您可以使用中间件来处理您的请求:
该中间件获取请求并将其发送到其他应用程序并获取该响应并转发给第一个应用程序。
只是想法的样本:
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();
}
});
}
}
我认为你必须根据到不同目的地的路径分开。
推荐阅读
- php - 我想为多个变量添加值如果条件简写
- sql-server - 无法在具有 2 个数据库引擎连接的 SSMS 中运行 sql 文件(1 个是服务器连接,另一个是本地数据库引擎)
- android - Android Q 模拟器 - Build.VERSION.SDK_INT 返回 28
- python - 如何获得许多字节的最低有效位?
- shell - 如何在 Makefile 中的 shell 代码块内扩展通配符?
- django - Django 'ImportError: 无法导入名称 url'
- json - PySpark - 获取字典列表并将其键/值转换为列
- c++ - 如何计算字母在随机字母字符串中出现的次数
- reactjs - 在嵌套组件方面难以理解 componentDidMount() 方法
- c++ - 如何将 UTF8 std::string 转换为 NSString?