3

私は.netサービスでOpenRastaフレームワークを使用しており、ハンドラーには以下の2つのメソッドがあります

public OperationResult Get(int Number)
{
// Do some operation and get an entity
  return new OperationResult.OK(Single-MyResource);
}

public OperationResult GetQ()
{
// Do some operation and get an entity
  return new OperationResult.OK(List-Of-MyResource);
}

私の設定は以下のようになります

ResourceSpace.Has.ResourcesOfType<MyResource>()
          .AtUri("/MyResource/{Id}")
          .And.AtUri("/MyResource")
          .HandledBy<MyResourceHandler>()
          .AsJsonDataContract() 
          .And.AsXmlDataContract()


 ResourceSpace.Has.ResourcesOfType<IList<MyResource>>()
         .AtUri("/MyResources") 
         .HandledBy<MyResourceHandler>()
         .AsJsonDataContract()
         .And.AsXmlDataContract();

HttpMethod: GET AcceptHeader: "application/json" URI: http://testDomain.com/MyResource/

上記のリクエストは、以下のリクエストで取得したものと同じ MyResource のリストを提供します

HttpMethod: GET AcceptHeader: "application/json" URI: http://testDomain.com/MyResources/

構成をに変更した後

ResourceSpace.Has.ResourcesOfType<MyResource>()
          .AtUri("/MyResource/{Id}")
          .And.AtUri("/MyResource").Named("MyResource")
          .HandledBy<MyResourceHandler>()
          .AsJsonDataContract() 
          .And.AsXmlDataContract()

そしてハンドラに適切な変更を加えます

[HttpOperation(HttpMethod.GET, ForUriName = "MyResource")]

OpenRasta は 415 http ステータス コードを返します。

上記は再び一貫性がありません。

上記と同様の構成の他のリソースの場合、OpenRasta は 403 http ステータス コードをスローします

4

2 に答える 2

1

最初のケースが正しいです。2 つの間でハンドラーを共有します。そのため、メソッドを選択するためにハンドラを見ると、パラメータを持つ候補とパラメータを持たない候補が 1 つずつあります。/MyResource に移動すると、ハンドラが検索され、パラメータを持たないメソッドが検索されます。これは予期される動作です。

2 番目の構成では、何かが欠けています。415 は、要求データが OR で理解されない場合です。GET であるため、処理する要求メディア タイプはありません。これには、何が起こっているかを確認するためのデバッグ ログが必要です。あなたのリクエストに、リクエスト データと Content-Type が含まれていませんか?

于 2012-07-24T13:37:47.310 に答える
0

OpenRasta の GET 側については、かなり頭の中にあります。まだ苦労している POST です。

私はJSONについてのみあなたと本当に似たようなことをしましたが、次のようにしました:

    ResourceSpace.Has.ResourcesOfType<IList<MyResource>>()
                .AtUri("/myresource").And
                .AtUri("/myresource/{id}").HandledBy<ResourceHandler>().AsJsonDataContract();



    [HttpOperation(HttpMethod.GET)] 
    public IEnumerable<MyResource> Get(int id = 0)
    {
        if (id == 0)
            return Context.Set<MyResource>().ToList();
        else
            return GetMyResourceMethod(id).ToList();
    }

    private IQueryable<MyResource> GetMyResourceMethod(int id)
    {
        var myresource = from resource in Context.Set<MyResource>()
                      where resource.MyResourceId == id
                      select resource;
        return myresource;
    }

Get メソッドの既定のパラメーターを使用して、パラメーターを使用する場合と使用しない場合の両方を処理できます。パラメータなしのオプションがリストを返すため、2番目の構成から ResourceType から IList が欠落していると思います。その場合、ToList() メソッドを介して IEnumerable を返すことは避けられません。

これはすべて、「List-Of-MyResource」で SQL-to-Linq を使用していることを前提としていますが、コードのその部分とそれが何をしているのかわかりません。私が含めたプライベート関数を無視するだけでなく、独自のアプローチをとってください。

于 2012-12-07T12:12:09.613 に答える