7

ServiceStackサービスにPOSTして、CREATEDエンティティの応答からLocationヘッダーを取得しようとしています。IReturnの使用が有効かどうかはわかりませんが、クライアントからResponseヘッダーにアクセスする方法はわかりません。誰かがHttpResultを適切に操作する方法を理解するのを手伝ってもらえますか?コードの下部に、私がやりたいことを示すテストケースがあります。これがcodzです:

    public class ServiceStackSpike
{
    public class AppHost : AppHostHttpListenerBase
    {
        public AppHost() : base("TODOs Tests", typeof(Todo).Assembly) { }

        public override void Configure(Container container)
        {
            //noop
        }
    }


    [Route("/todos", "POST")]
    public class Todo:IReturn<HttpResult>
    {
        public long Id { get; set; }
        public string Content { get; set; }
        public int Order { get; set; }
        public bool Done { get; set; }
    }


    public class TodosService : Service
    {
        public object Post(Todo todo)
        {
            //do stuff here
            var result = new HttpResult(todo,HttpStatusCode.Created);
            result.Headers[HttpHeaders.Location] = "/tada";
            return result;
        }


    }


    public class NewApiTodosTests : IDisposable
    {
        const string BaseUri = "http://localhost:82/";

        AppHost appHost;

        public NewApiTodosTests()
        {
            appHost = new AppHost();
            appHost.Init();
            appHost.Start(BaseUri);                
        }


        [Fact]
        public void Run()
        {
            var restClient = new JsonServiceClient(BaseUri);


            var todo = restClient.Post(new Todo { Content = "New TODO", Order = 1 });
            Assert.Equal(todo.Headers[HttpHeaders.Location], "/tada"); //=>fail
        }

        public void Dispose()
        {
            appHost.Dispose();
            appHost = null;
        }
    }

}
4

1 に答える 1

7

HTTP 応答をカスタマイズするさまざまな方法については、Customizing HTTP Responses ServiceStack wiki ページを参照してください。

AHttpResultは、HTTP 応答をカスタマイズする 1 つの方法にすぎません。リダイレクトする場合は、通常、絶対 URL を含める必要があります。たとえば、次のようになります。

public object Post(Todo todo)
{
    var todo = ...;
    return new HttpResult(todo, HttpStatusCode.Created) { 
        Location = base.Request.AbsoluteUri.CombineWith("/tada")
    };
}

注 HTTP クライアントはDTO を認識しません。HttpResultHttpResult自体は DTOではなく、必要なカスタマイズされた HTTP 応答をキャプチャして変更することのみを目的としています。

すべての ServiceStack クライアントが返すのは HTTP 本文 (この場合はTodo応答 DTO) です。ロケーションは確かに HTTP 応答ヘッダーに追加されます。返された HTTP 応答全体を確認するには、Fiddler、WireShark、Chrome の WebInspector などの HTTP スニファーを使用する必要があります。

ServiceStack の HTTP クライアントを使用してアクセスする場合は、次のように、へのアクセスを許可する応答フィルターを追加する必要がありますHttpWebResponse

restClient.ResponseFilter = httpRes => {
      Assert.Equal(httpRes.Headers[HttpHeaders.Location], "/tada"); 
 };

Todo todo = restClient.Post(new Todo { Content = "New TODO", Order = 1 });

Web Request Extensions を使用した応答ヘッダーの検査

HTTP 応答を検査するだけの場合のもう 1 つの軽量な代替方法は、ServiceStack の便利な WebRequest 拡張メソッドを使用することです。

var url = "http://path/to/service";
var json = url.GetJsonFromUrl(httpRes => {
      Assert.Equal(httpRes.Headers[HttpHeaders.Location], "/tada"); 
});
于 2012-11-19T21:23:58.633 に答える