从泛型类型方法返回状态代码未授权
本文关键字:代码 授权 状态 返回 泛型类型 方法 | 更新日期: 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方法具有泛型类型。
我只想在我的作者详细信息页面上显示消息,就像您未经授权执行此操作一样。我该怎么做?
你有两个选择
- 添加一个类型以包装结果,例如
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 或其他东西。您还可以使用适合您的代码的值来滚动自己的枚举。
- 或者,可以引发包含状态代码的异常。第二种方法更容易实现,需要较少的重构,但第一种方法是推荐的。