2013-02-22 82 views
1

我正在构建一个.NET 4.5 MVC 4 Web API,该API将公开公开我希望访问的控制器方法。我创建了一个行为过滤器属性检查如下图所示烧毁为了简洁正确编码的RSA令牌:Compact Framework中的HttpResponseMessage内容属性

public class TokenValidationAttribute : ActionFilterAttribute 
{ 
    public override void OnActionExecuting(HttpActionContext actionContext) 
    { 
     try 
     { 
      //authorize user 
     } 
     catch (Exception) 
     {     
      actionContext.Response = new HttpResponseMessage(HttpStatusCode.Forbidden) 
      { 
       Content = new StringContent("Unauthorized User") 
      };     
     } 
    } 
} 

然后在我的.NET CF 3.5应用程序,我将做到以下几点:

public static List<string> GetAvailableProjectIds() 
     { 
     var idList = new List<string>(); 
     var url = "the url"; 
     var req = CreateRequest(url, true); 

     try 
     { 
      using (var response = (HttpWebResponse)req.GetResponse()) 
      { 
       //do something with the resonse 
      } 
     } 
     catch (Exception ex) 
     { 

     } 

     return idList; 
    } 

被捕获的异常是WebException并包含正确的403 Forbiden状态码。但没什么帮助,我可以找到。

有没有办法获得Content属性,以便我可以向最终用户展示他们尝试使用“未经授权的用户”进行身份验证?

+0

你的意思是,在它“未授权用户”的内容没有身体?此外,如果为什么不发送“未经授权”状态代码而不是此场景? – 2013-02-23 01:03:14

+0

不,在调试模式下查看WebException时,我没有在任何地方看到“未经授权的用户”。使用“未经授权”状态码的点。这比“福尔拜登”更有意义。但是,有很多情况下,状态代码不足以提供足够的信息。也许你正在查询一个Web服务,告诉你什么时候你最喜欢的运动队今晚出场。难道你不想回复一条消息:“对不起你的团队今晚不玩”,而不是“NotFound”的回应? “NotFound”得到了重点,但几乎没有那么友好。 – nitewulf50 2013-02-23 03:17:30

+0

当然,有一个消息肯定是有用的......只是可以肯定,你可以检查通过提琴手什么样的响应是服务返回只是为了消除服务的任何问题 – 2013-02-23 19:14:47

回答

0

我从来没有真正喜欢过这样的行为,当通信很好时它会使用异常。尝试添加此扩展方法:

private static HttpResponse GetAnyResponse(this HttpRequest req) 
{ 
    HttpResponse retVal = null; 

    try 
    { 
     retVal = (HttpWebResponse)req.GetResponse() 
    } 
    catch (WebException webEx) 
    { 
     retVal = webEx.Response; 
    } 
    catch (Exception ex) 
    { 
     // these are the "bad" exceptions, let them pass 
     throw; 
    } 

    return webEx; 
} 

然后你的代码改成这样:

using (var response = (HttpWebResponse)req.GetAnyResponse()) 
{ 
    //do something with the resonse 
} 
+0

很明显,一旦你有Response对象,你可以访问标题,正文等... – tcarvin 2013-02-28 13:07:40