Служба 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?