В настоящее время я выполняю миграцию моей службы 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?