Служба REST WCF 4 не может возвратить StatusDescription, только StatusCode - PullRequest
8 голосов
/ 06 августа 2010

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

4 голосов
/ 14 января 2011

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

throw new WebFaultException<string> ("bad digest", HttpStatusCode.Forbidden);
2 голосов
/ 19 января 2011

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

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

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

1 голос
/ 18 марта 2011

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

1 голос
/ 19 января 2011

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

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

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

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

WebOperationContext.Current.IncomingResponse.StatusDescription

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

...