Служба REST WCF 4 не может возвратить StatusDescription, только StatusCode

В настоящее время я выполняю миграцию моей службы WCF RESTful из.NET 3.5 (Starter Kit) в.NET 4. Я начал свой проект, используя шаблон службы WCF Rest из Visual Studio 2010. Мне пришлось выяснить, как сохранить свою схему авторизации (ранее) сделано с RequestInterceptor), используя ServiceAuthorizationManager. После некоторой работы и исследований я сделал это. Но сейчас у меня есть побочная проблема. Мой сервис раньше сообщал моему клиенту о любых ошибках обработки, используя код состояния HTTP и краткое описание. Я использовал WebOperationContext во многих моментах моего метода обслуживания, чтобы описать клиентам, что пошло не так, например:

protected void returnCode(HttpStatusCode code, string description)
{
    WebOperationContext ctx = WebOperationContext.Current;
    ctx.OutgoingResponse.StatusDescription = description;
    ctx.OutgoingResponse.StatusCode = code;
}

Но в WCF 4 работает только StatusCode - StatusDescription не работает. Я не могу понять, почему. Мое единственное предположение, что WebOperationContext не работает в этом новом сценарии WCF 4, и я должен вместо этого использовать OperationContext, но это также не работает. Следующий метод используется в моем пользовательском классе, расширяющем ServiceAuthorizationManager, информируя клиентов о том, что запрос не может быть получен, потому что дайджест аутентификации был искажен:

private void GenerateBadDigestMessage(ref OperationContext operationContext)
{
    Message reply = Message.CreateMessage(MessageVersion.None, null, null, new DataContractJsonSerializer(typeof(object)));

    HttpResponseMessageProperty hrp = new HttpResponseMessageProperty();
    hrp.StatusCode = HttpStatusCode.Forbidden;
    hrp.StatusDescription = "bad digest";
    reply.Properties[HttpResponseMessageProperty.Name] = hrp;

    operationContext.RequestContext.Reply(reply);
    operationContext.RequestContext = null;
}

Даже используя директиву OperationContext здесь (вместо WebOperationContext), StatusDescription не работает.

Что мне здесь не хватает? Почему такая мелочь может сломаться с.NET 3.5 на 4?

4 ответа

Я рекомендую вам использовать WebFaultException в.NET 4.0. Прочитайте, например, "Представление служб WCF WebHttp в.NET 4". Пытаться

throw new WebFaultException<string> ("bad digest", HttpStatusCode.Forbidden);

ХОРОШО! Вот что я узнал. В моем коде нет ничего плохого. Нет ничего плохого в.NET Framework 3.5 или 4.0.

Проблема в разработке сервера asp.net. При отладке приложения-службы оно, скорее всего, будет размещено на сервере разработки asp.net и полностью игнорирует описание состояния, данное приложением. Отослать этот вопрос.

Вручение награды @Oleg, который хотя бы попытался мне помочь.

Убедитесь, что вы вернулись из объекта Service Method NULL... чтобы описание кода состояния было видно в заголовках ответа, это сработало для меня.

Одна потенциальная проблема состоит в том, что вы устанавливаете RequestContext в нуль:

operationContext.RequestContext.Reply(reply);     
operationContext.RequestContext = null; 

Другая возможность заключается в том, что параметр "описание" не установлен.

Также на стороне клиента вы проверяете:

WebOperationContext.Current.IncomingResponse.StatusDescription

Еще одна возможность, могли ли значения быть перезаписаны после вызова returnCode?

Другие вопросы по тегам