我已经创建了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块返回消息。
我只想在我的作者详细信息页面上显示消息,就像您未经授权执行此操作一样。我该怎么办?
答案 0 :(得分: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并将其称为IsSuccessful等。您也可以使用适合您代码的值滚动自己的枚举。