POST to ServiceStack Service и получение заголовка местоположения

Я пытаюсь отправить POST в мою службу ServiceStack и получить заголовок Location из ответа моей СОЗДАННОЙ сущности. Я не уверен, допустимо ли использование IReturn, но я не уверен, как получить доступ к заголовкам ответа от моего клиента. Может кто-нибудь помочь мне понять, как правильно взаимодействовать с HttpResult? Внизу кода есть контрольный пример, демонстрирующий, что я хочу сделать. Вот's кодз:

    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
    {
        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;
        }
    }

}

Ответы на вопрос(1)

Решение Вопроса

Настройка HTTP-ответов ServiceStack вики-страница для всех различных способов настройки HTTP Response.A

HttpResult это только один способ настроить HTTP-ответ. Как правило, вы хотите включить Абсолютный URL, если высобирается перенаправить его, например:

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

Примечание: клиенты HTTP будутникогда смHttpResult DTO. HttpResult isне DTO само по себе этоЕдинственная цель - захватить и изменить настроенный HTTP-ответ, который вы хотите.

Все клиенты ServiceStack будут возвращать тело HTTP, которое в данном случае являетсяTodo Ответ ДТО.Место нахождения действительно добавляется в заголовки 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 });
Проверка заголовков ответов с использованием расширений веб-запросов

Другая легкая альтернатива, если вы просто хотите проверить HTTP-ответ, - это использовать ServiceStack 's Удобные методы расширения WebRequest, например:

var url = "http://path/to/service";
var json = url.GetJsonFromUrl(httpRes => {
      Assert.Equal(httpRes.Headers[HttpHeaders.Location], "/tada"); 
});
 Gui11 июн. 2013 г., 04:11
На это следует ссылаться из документации, отличный ответ. Спасибо
 mythz20 нояб. 2012 г., 00:02
Мы обновили его, чтобы показать альтернативный облегченный способ доступа к заголовкам ответов.
 SonOfNun19 нояб. 2012 г., 22:42
Спасибо за ваш ответ Демис! Это отвечает на мой вопрос. Похоже, что применение фильтров в глобальном масштабе вынудит меня теперь к условной обработке ответов :(. POST для службы, с которой я на самом деле разговариваю, неt вернуть тело сущности, только заголовок Location, где я могу найти только что созданный ресурс. Есть ли лучший подход, чтобы сделать запрос и просто проверить заголовки после ответа?
 SonOfNun20 нояб. 2012 г., 00:45
Тот'потрясающе Спасибо за ответ и за рамки. С ним было приятно работать.
 SonOfNun19 нояб. 2012 г., 23:44
Похоже, что лучший подход - это просто рассматривать клиентские экземпляры как временные. В этом случае клиент по запросу. Это все еще неестественно расщепляет логику запрос-ответ, но лучше, чем фильтры, содержащие условные проверки.

Ваш ответ на вопрос