3

背景:我们需要能够支持 IIS 以外的 Web 服务器。为此,我们计划将所有处理逻辑转移到另一个服务,该服务将使用排队机制作为传输(具体为 RabbitMQ)。我们将有一个 HTTP web api,它基本上会将所有请求转发到这个其他服务;对于 IIS,我们将在 C# 和 Java 中为其他 Web 服务器(如 Tomcat)实现这个外观。

我的问题是这个;对于 c#,将所有 HTTP 请求和内容请求转发到另一个服务的最佳方式是什么。我正在考虑为此使用 asmx HTTPHandler;我让它工作;但解决方案很丑陋,需要使用 URL 重写器来处理干净的 URL。

有谁知道是否可以使用 MVC 或 web-api 本身来做到这一点?我们基本上把收到的所有内容;URL 本身、cookies、查询字符串等;将其打包并送去处理。

4

2 回答 2

0

想出了如何使用 Web-API 和通配符路由来做到这一点。

感谢您输入阿列克谢。

于 2012-11-05T16:46:31.750 回答
0

(回复一个老问题,但可能对其他人有用)

我有一个类似的问题,我们需要在只支持基本或 kerberos 身份验证的 web api 前面放置一个外观。

我使用了这个解决方案,将传入的 url 转换为后端服务器的 url:http: //www.dotnetspeak.com/asp-net-mvc/using-webapi-in-multi-tier-web-application/

我在该解决方案中添加了一些逻辑来检查标头中的令牌(来自 asp.net 登录系统),因为 ExecuteAsync 在授权过滤器之前执行:

var token = controllerContext.Request.Headers.Authorization;
if (token != null && token.Scheme.Equals("bearer", StringComparison.InvariantCultureIgnoreCase))
{
     var ticket = Startup.OAuthOptions.AccessTokenFormat.Unprotect(token.Parameter);

     if (ticket != null && ticket.Identity != null && ticket.Identity.IsAuthenticated)
     {
          var claimsPrincipal = new ClaimsPrincipal(ticket.Identity);
          //From here, you can use the claimsPrinciple to check if user is allowed to even call the service.
          var authorized = claimsPrincipal.IsInRole("Users");

     }
 }

如果 Startup.OAuthOptions 不可用,您可能需要将其转换为 Startup.cs 或 Startup.Auth.cs 中的静态变量。

因为我需要提供一种替代身份验证方法而不是后端服务的基本身份验证,所以添加了额外的标头更新以切换到基本身份验证。

//from the dotnetspeak solution (copy existing headers)
foreach (var httpRequestHeader in controllerContext.Request.Headers)
{
    client.DefaultRequestHeaders.Add(httpRequestHeader.Key, httpRequestHeader.Value);
}

//Set basic authentication, whatever the original Authorization header might have been
//TODO: use lookup table or something like that to convert claimsPrinciple to matching domain user account 
var byteArray = Encoding.ASCII.GetBytes(@"Domain\userId:password");
client.DefaultRequestHeaders.Authorization = new System.Net.Http.Headers.AuthenticationHeaderValue("Basic", Convert.ToBase64String(byteArray));
于 2017-05-10T08:07:21.347 回答