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

本文关键字:代码 授权 状态 返回 泛型类型 方法 | 更新日期: 2023-09-27 17:56:49

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

我创建了泛型类型方法,从中调用我的服务方法并将结果返回给操作方法,如下所示:

 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方法具有泛型类型。

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

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

你有两个选择

  1. 添加一个类型以包装结果,例如 WSResult<T> 。然后,您的方法将返回该类型。它可以看起来像这样
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,并称它为 IsSuccess 或其他东西。您还可以使用适合您的代码的值来滚动自己的枚举。

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