WCF Возвратное возвращение HttpResponseMessage хочет вести переговоры при настройке содержимого

У меня есть служба WCF Restful, и мне бы хотелось, чтобы методы возвращали HttpResponseMessage, потому что они кажутся структурированными, а не просто возвращающими данные или исключение или что-то еще, что может там сделать.

Я предполагаю, что это правильно, если не дайте мне знать, но моя проблема в том, что происходит, когда я пытаюсь установить HttpResponseMessage.Content. Когда я это делаю, клиент, в котором я сделал проверку запроса запроса RESTful.

Вот мой код:

В интерфейсе:

[WebGet(UriTemplate = "/GetDetailsForName?name={name}"
                    , ResponseFormat = WebMessageFormat.Json)]
HttpResponseMessage GetDetailsForName(string name);

В классе:

public HttpResponseMessage GetDetailsForName(string name)
{
   HttpResponseMessage hrm = new HttpResponseMessage(HttpStatusCode.OK)
       {
       //If I leave this line out, I get the response, albeit empty  
       Content = new StringContent("Hi") 
       };

   return hrm;
}

Я хотел попробовать использовать Request.CreateResponse, но я не могу получить запрос от моего метода WCF Restful. OperationContext.Current.RequestContext не имеет CreateResponse.

Любые указатели?

Ответ 1

К сожалению, это не сработает. Показанный код говорит:

Построить объект HttpResponseMessage, сериализовать его с помощью сериализатора JSON и передать результат по проводке.

Проблема HttpResponseMessage является одноразовой и не предназначена для сериализации, а StringContent не может быть сериализована вообще.

Что касается того, почему вы перенаправлены на форму аутентификации - служба генерирует исключение, если оно не может сериализоваться StringContent и возвращает код состояния HTTP 400, который интерпретируется как проблема проверки подлинности.

Ответ 2

Если я вызываю, например, публичную строку getDetails (int ID) и выдается ошибка, это работает...

catch(Exception ex)
 {
 OutgoingWebResponseContext response = WebOperationContext.Current.OutgoingResponse;
 response.StatusCode = System.Net.HttpStatusCode.OK; //this returns whatever Status Code you want to set here
 response.StatusDescription = ex.Message.ToString(); //this can be accessed in the client
 return "returnValue:-998,message:\"Database error retrieving customer details\""; //this is returned in the body and can be read from the stream
 }