2016-07-13 11 views
0

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メソッドがジェネリック型を持つため、不正アクセスの場合にcatchブロックからどのようにメッセージを返すことができますか?

このアクションを実行する権限がないのと同じように、作成者の詳細ページにメッセージを表示したいだけです。どうしたらいいですか?

答えて

1

は、次の2つの選択肢

  1. WSResult<T>に対する結果をラップするタイプを追加しています。次に、あなたのメソッドはその型を返します。これは、この
public class WSResult 
{ 
    public T Result { get; set; } 
    public HttpStatusCode StatusCode { get; set; } 
} 

次に、あなたのメソッドが返されます。このタイプのように見えることができ、消費者は、最初の状態を確認します。これは、HttpResponseMessageがどのように動作するかと似ています。そこからアイデアをコピーすることができます。この場合

あなたの方法は、あなたがこの

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

それともキャッチ

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

注実際そのようにそれから物事を返すこの

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

のような署名を持っています例外内のステータスコードが異なる可能性があり、適切な例外をキャッチする必要があります。また、HttpStatusCodeの代わりにブール値を使用して、IsSuccessfulまたは何かを呼び出すこともできます。あなたのコードに適した値で独自のenumをロールすることもできます。

  1. また、ステータスコードを含む例外をスローすることもできます。 2番目の方法は実装が簡単で、リファクタリングが少なくてすみますが、最初の方法が推奨されます。
+0

賛成ですが、ちょっと注意してください。クラスそのものは汎用的でなければなりません:public class WSResult {public T Result {get; set;}パブリックHttpStatusCode StatusCode {get; setter;}} –

+0

何らかの理由で私はフォーマッタを処理できず、タグとして扱います。私はそれを修正するために別のブラウザでログインします。 – Stilgar

+0

返す必要があることを正確に説明していただけますか? T型に変換できないメッセージが表示されているので – Ankita

関連する問題