58

両方を理解し、サンプル コードを記述しようとしました。

 public HttpResponseMessage Get()
 {
     var response = ControllerContext.Request
                         .CreateResponse(HttpStatusCode.BadRequest, "abc");

     throw new HttpResponseException(response);
 }

と:

 public HttpResponseMessage Get()
 {
     return ControllerContext.Request
                        .CreateResponse(HttpStatusCode.BadRequest, "abc");
 }

フィドルから、私は本当にそれらの間に違いが見られなかったので、使用する目的は何HttpResponseExceptionですか?

4

5 に答える 5

67

両者の主な違いはこれです。例外は、処理をすぐに停止して終了するのに役立ちます。たとえば、次のコードがあるとします

public class CustomerController : ApiController {
  private ICustomerContext repo;

  public CustomerController(ICustomerContext repo) {
    this.repo = repo;
  }

  public Customer Get(int id) {
    var customer = repo.Customers.SingleOrDefault(c=>c.CustomerID == id);
    if (customer == null) {
      throw new HttpResponseException(new HttpResponseMessage(HttpStatusCode.NotFound));
    }
    return customer;
  }
}

このコードが実行され、存在しない ID を渡すと、すぐに処理が停止し、ステータス コード 404 が返されます。

代わりに HttpResponseMessage を返すと、リクエストは喜んで残りの処理を続行し、404 を返します。主な違いは、リクエストを終了するかどうかです。

ダレルが言ったように、例外は、処理を続行したい場合 (顧客が見つかった場合など) とそうでない場合に役立ちます。

HttpResponseMessage のようなものを使用したい場所は、Http POST で、ステータス コード 201 を返し、ロケーション ヘッダーを設定することです。その場合、処理を続行したいと思います。それはこのコードでうまくいきます.*

public class CustomerController : ApiController {
  private ICustomerContext repo;

  public CustomerController(ICustomerContext repo) {
    this.repo = repo;
  }

  public HttpResponseMessage Post(Customer customer) {
    repo.Add(customer);
    repo.SaveChanges();
    var response = Request.CreateResponse(HttpStatusCode.Created, customer);
    response.Headers.Location = new Uri(Request.RequestUri, string.format("customer/{0}", customer.id));
    return response;
  }
}

*注意: ベータ版を使用している場合は、新しい HttpResponseMessage を作成します。私は後のビットを使用していますが、リクエストから CreateResponse 拡張メソッドを使用する必要があります。

上記では、ステータス コードを 201 に設定し、顧客を渡し、ロケーション ヘッダーを設定する応答を作成しています。

その後、応答が返され、要求の処理が続行されます。

お役に立てれば

于 2012-05-24T09:18:00.877 に答える
28

HttpResponseException は、コントローラー アクションの署名が次のように見える場合に役立ちます。

  Foo Get(int id)

この場合、400 のようなステータス コードを簡単に返すことはできません。

HttpResponseMessage<T>Web API の次のリリースで廃止されることに注意してください。

于 2012-05-19T03:41:37.387 に答える
13

応答を単体テストしたいと仮定すると、常に HttpResponseMessage を返すのは理にかなっていませんか? 典型的な開発パターンに従わないため、ApiController から単純な型を返すという考えは特に好きではありません。

Customer を取得した非 Web API クラスでは、null 応答をチェックする呼び出しコードで null を返す可能性があります。

public Customer GetCustomer(int id)
{
    return db.Customers.Find(id);
}

しかし、Web API では、null を返すつもりはありません。HttpResponseException をスローした後に何かが作成されたとしても、何かを返す必要があります。その場合、テストを容易にするために、常に HttpResponseMessage を返し、それを署名にしないのはなぜでしょうか?

public HttpResponseMessage GetCustomer(int id)
{
    var customer = db.Customers.Find(id);
    if (customer == null)
    {
        return Request.CreateResponse(HttpStatusCode.NotFound);
    }

    return Request.CreateResponse(HttpStatusCode.OK, customer);
}
于 2012-06-07T14:52:35.957 に答える
2

HttpResponseExceptionから派生しException、埋め込みHttpResponseMessageます。から派生しているため、次のシナリオExceptionで役立ちます。trycatch

によって返されるデフォルトのステータス コードHttpResponseExceptionは ですHttpStatusCode.InternalServerError

于 2012-05-19T03:27:25.030 に答える