返回状态代码从通用类型方法未授权

时间:2016-07-13 11:33:03

标签: c# generics

我已经创建了web api并从MVC应用程序调用服务方法。我在Web Api中实现了身份验证。

我创建了Generic类型方法,我从中调用我的服务方法并将结果返回到下面的操作方法:

 public async Task < T > GetWSObject < T > (string uriActionString)  
        {  
            T returnValue = default (T);  
            try  
            {  
                using(var client = new HttpClient())  
                {
                    //client.BaseAddress = new Uri("http://localhost:50524/"); 
                    //client.DefaultRequestHeaders.Accept.Clear();  
                    //client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json")); 
                   // HttpClient cons = new HttpClient();
                    client.BaseAddress = new Uri("http://localhost:50524/"); // Web Service URL
                    client.DefaultRequestHeaders.Accept.Clear();
                    client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
                    var data = Encoding.ASCII.GetBytes("Ankita:ankita12");
                    var header = new AuthenticationHeaderValue("Basic", Convert.ToBase64String(data));
                    client.DefaultRequestHeaders.Authorization = header;
                    HttpResponseMessage response = await client.GetAsync(uriActionString);                    
                    response.EnsureSuccessStatusCode();  
                    returnValue = JsonConvert.DeserializeObject < T > (((HttpResponseMessage) response).Content.ReadAsStringAsync().Result);  
                }  
                return returnValue;  
            }  
            catch (Exception e)  
            {  
                throw (e);  
            }  
        }

此外,我从我的动作方法调用此方法,如:

 public async Task<ActionResult> ViewAuthor(Author author)
    {       
            ViewBag.Message = "Your Author page.";
            Author authors = new Author();
            string urlAction = String.Format("api/Authors/GetAuthor/{0}", author.Id);
            authors = await GetWSObject<Author>(urlAction);
            return View(authors);         

    }

现在,如果GetWSObject方法具有泛型类型,如何在未授权访问的情况下从catch块返回消息。

我只想在我的作者详细信息页面上显示消息,就像您未经授权执行此操作一样。我该怎么办?

1 个答案:

答案 0 :(得分:1)

您有两个选择

  1. 添加一个类型以包含示例WSResult<T>的结果。然后您的方法将返回该类型。它看起来像这样
  2. public class WSResult
    {
        public T Result { get; set; }
        public HttpStatusCode StatusCode { get; set; }
    }
    

    然后您的方法将返回此类型,消费者将首先检查状态。这与HttpResponseMessage的工作方式类似。你可以从中复制想法。

    在这种情况下,您的方法有一个像这样的签名

    public async Task<WSResult<T>> GetWSObject<T> (string uriActionString)
    

    你可以像这样返回它的东西

    return new WSResult<T> { Result = returnValue, Status = HttpStatusCode.OK }
    

    或者在捕捉

    return new WSResult<T> { Result = returnValue, Status = HttpStatusCode.InternalServerError }
    

    请注意,异常中的实际状态代码可能不同,您应该捕获正确的异常。您也可以使用布尔值而不是HttpStatusCode并将其称为IsSuccessful等。您也可以使用适合您代码的值滚动自己的枚举。

    1. 或者,您可以抛出包含状态代码的异常。第二种方式更容易实现,需要更少的重构,但第一种方法是推荐的方式。