8

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

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 direclty здесь (Insted из WebOperationContext), StatusDescription не Работа.

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

+0

Самостоятельно или IIS? Какая версия сервера? Я протестировал это на 4.0 с самообслуживанием Server 2008R2, и он отлично работает (возвращает описание статуса как установлено). – nitzmahone

+0

Вы когда-нибудь находили решение? Я столкнулся с той же проблемой. – Hemant

ответ

4

Я рекомендую вам использовать WebFaultException в .NET 4.0. Читайте, например, "Introducing WCF WebHttp Services in .NET 4". Попробуйте

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

Извините, но использование .NET 4.0 не является вариантом. Любая удача с .NET 3.5? – Hemant

+0

@ Gemant: Извините за недоразумение, но вы начинаете свой вопрос со слова, что вы в настоящее время переносите свою службу с .NET 3.5 (Starter Kit) на .NET 4, и у вас есть некоторые проблемы.Поэтому я так понимаю, что у вас уже работает решение в .NET 3.5, и вы хотите, чтобы он работал в .NET 4.0. У меня такая же проблема. В .NET 3.5 я использовал 'WebProtocolException' для сообщения об ошибках. После перехода на .NET 4.0 я решил, что ** не использовать ** устаревший набор запуска WCF REST. В .NET 4.0 есть все функции, необходимые для разработки WCF REST. Вместо 'WebProtocolException' я использую' WebFaultException'. – Oleg

+0

Спасибо за ответ. Я изначально не задавал этот вопрос. Я просто боролся с той же проблемой и вижу, что выше уже заданного вопроса нет ответов, наложите на него щедрость. – Hemant

1

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

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

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

Кроме того, на стороне клиента, вы проверки:

WebOperationContext.Current.IncomingResponse.StatusDescription 

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

2

OK! Вот что я узнал. В моем коде нет ничего плохого. В .NET Framework 3.5 или 4.0 нет ничего плохого.

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

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

+0

Кстати, это также причина, по которой он не работает в Web Api. Я нашел ваш ответ, и как только я запустил свой код под IIS, ReasonPhrase изменил описание состояния. –

1

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

Смежные вопросы