7

我正在尝试发布到我的 ServiceStack 服务并从我的 CREATED 实体的响应中检索 Location 标头。我不确定使用 IReturn 是否有效,但我不确定如何从我的客户端访问响应标头。有人可以帮助我了解如何正确与 HttpResult 交互吗?代码底部有一个测试用例来演示我想要做什么。这是鳕鱼:

    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 响应的所有不同方法,请参阅自定义 HTTP 响应ServiceStack wiki 页面。

AHttpResult只是自定义 HTTP 响应的一种方式。如果要重定向绝对网址,通常需要包含它,例如:

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

注意 HTTP 客户端永远不会看到HttpResultDTO。HttpResult本身不是 DTO,它的唯一目的是捕获和修改您想要的自定义 HTTP 响应。

所有 ServiceStack 客户端将返回 HTTP 正文,在本例中为Todo响应 DTO。Location确实添加到了 HTTP 响应标头中,要查看返回的整个 HTTP 响应,您应该使用 HTTP 嗅探器,例如 Fiddler、WireShark 或 Chrome 的 WebInspector 。

如果您想使用 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 请求扩展检查响应标头

如果您只想检查 HTTP 响应,另一个轻量级的选择是使用 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 回答