【问题标题】:How to implement a web api facade in c#如何在 C# 中实现 web api 外观
【发布时间】:2012-10-22 07:27:23
【问题描述】:

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

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

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

【问题讨论】:

  • 我认为您正在尝试构建“透明代理”。如果使用 MVC 只是在通配符路由上为根(如“/*”)处理所有请求...
  • 谢谢亚历克西;透明代理是正确的。我将尝试 MVC 通配符路由,看看效果如何。
  • ASMX 是一项遗留技术,不应用于新开发。

标签: c# asp.net-mvc c#-4.0 asmx asp.net-web-api-routing


【解决方案1】:

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

感谢您输入 Alexei。

【讨论】:

【解决方案2】:

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

我有一个类似的问题,我们需要在只支持基本或 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));

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-02-19
    • 2013-02-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多