【问题标题】:Getting HttpRequest extension method written for MVC to work in Web Api获取为 MVC 编写的 HttpRequest 扩展方法以在 Web Api 中工作
【发布时间】:2012-10-15 03:51:51
【问题描述】:

我正在使用用于 MVC 的 OAuth 2.0,这是一个用于 Oauth2 的 .NET 库。但是,我正在构建一个 Web Api 项目,并希望让这个库与 Web Api 一起使用。

我遇到的问题是该库在从控制器调用的 HttpRequestBase 上使用了两个扩展方法。

以下是扩展方法:

public static string GetToken(this HttpRequest request)
    {
        var wrapper = new HttpRequestWrapper(request);
        return GetToken(wrapper);
    }

    public static string GetToken(this HttpRequestBase request)
    {
        if (request == null)
            return String.Empty;

        // Find Header
        var headerText = request.Headers[OAuthConstants.AuthorzationHeader];
        if (!String.IsNullOrEmpty(headerText))
        {
            var header = new AuthorizationHeader(headerText);
            if (string.Equals(header.Scheme, "OAuth", StringComparison.OrdinalIgnoreCase))
                return header.ParameterText.Trim();
        }

        // Find Clean Param
        var token = request.Params[OAuthConstants.AuthorzationParam];
        return !String.IsNullOrEmpty(token)
            ? token.Trim()
            : String.Empty;
    }

在 MVC 项目中,他们只需从控制器调用 Request.GetToken()。当然,Web Api 的请求是一个 HttpRequestMessage。恐怕现在解决 HttpRequest 和 HttpRequest 消息之间的差异超出了我的能力范围。

我可以将此扩展方法转换为与 HttpRequestMessage 一起使用或以某种方式使其在 Web Api 中工作吗??

谢谢!

【问题讨论】:

    标签: asp.net-mvc-3 asp.net-mvc-4 asp.net-web-api httprequest


    【解决方案1】:

    您以前拥有的所有属性仍然可用(假设 OAuthConstants.AuthorzationParam 已在查询字符串上设置?)

    using System;
    using System.Linq;
    using System.Net.Http;
    
    namespace YourApp
    {
        public static class Extensions
        {
            public static string GetToken(this HttpRequestMessage request)
            {
               if (request == null)
                   return String.Empty;
    
               // Find Header
               var headerText = request.Headers.GetValues(OAuthConstants.AuthorzationHeader).SingleOrDefault();
               if (!String.IsNullOrEmpty(headerText))
               {
                   //Brevity...
               }
    
               // Find Clean Param
               var token = request.GetQueryNameValuePairs().SingleOrDefault(x => x.Key == OAuthConstants.AuthorzationParam).Value;
               return !String.IsNullOrEmpty(token)
                   ? token.Trim()
                   : String.Empty;
           }
       }
    

    }

    控制器

    using System.Collections.Generic;
    using System.Web.Http;
    using YourApp;
    
    namespace YourApp.Controllers
    {
        public class FoosController : ApiController
        {
            public IEnumerable<string> Get()
            {
                var token = Request.GetToken();
    
                return null;
            }
        }
    }
    

    【讨论】:

    • 谢谢马克!我会检查一下。可以在查询字符串上设置 OAuthConstants.AuthorzationParam。代码似乎在检查正文,然后检查 oauth_token 值的查询字符串(即常量的值)。
    • @AndrewBSchultz 好的,如果您需要访问正文,那么 HttpRequestMessage 上的扩展方法可能不是最好的方法......让我知道您的进展情况
    猜你喜欢
    • 2018-11-21
    • 1970-01-01
    • 1970-01-01
    • 2016-02-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-01
    相关资源
    最近更新 更多