Silverlight + Google Chrome + пользовательские заголовки запросов =› ошибка типа контента

Я хочу добавить настраиваемые заголовки к каждому запросу, сделанному из моего приложения Silverlight в RIA DomainService.

Я делаю это, добавляя пользовательское поведение в коллекцию поведений конечной точки клиента домена.

Затем мое поведение добавляет пользовательский MessageInspector, который устанавливает мои пользовательские заголовки для запроса.

Все это отлично работает в IE, но в Google Chrome я получаю исключение, говорящее: "... Тип содержимого text/plain; charset=x-user-defined ответного сообщения не соответствует типу содержимого привязки (приложение /msbin1)...".

Кому-нибудь когда-нибудь удавалось добавлять собственные заголовки в запрос RIA Services и заставить его работать в Google Chrome? Может ли кто-нибудь помочь мне с этим?

Вот код моего пользовательского поведения:

public class AppendExtraHeadersHttpBehavior : WebHttpBehavior
{
  public AppendExtraHeadersHttpBehavior()
  {
  }

  public override void ApplyClientBehavior( ServiceEndpoint endpoint, ClientRuntime clientRuntime )
  {
    clientRuntime.MessageInspectors.Add( m_inspector );
  }

  private readonly AppendExtraHeadersMessageInspector m_inspector = new AppendExtraHeadersMessageInspector();
}

Вот код моего собственного инспектора сообщений:

public class AppendExtraHeadersMessageInspector : IClientMessageInspector
{
  public AppendExtraHeadersMessageInspector()
  {
  }

  public void AfterReceiveReply( ref Message reply, object correlationState )
  {
    // Nothing to do here.
  }

  public object BeforeSendRequest( ref Message request, IClientChannel channel )
  {
    var property = request.Properties[ HttpRequestMessageProperty.Name ] as HttpRequestMessageProperty;
    if( property != null )
    {
      property.Headers[ "CultureName" ] = Thread.CurrentThread.CurrentCulture.Name;
    }

    return null;
  }
}

И, наконец, вот код, который я добавил частично для своего DomainContext.

partial void OnCreated()
{
  var domainClient = this.DomainClient as WebDomainClient<IMyServiceContract>;
  if( domainClient != null )
  {
    domainClient.ChannelFactory.Endpoint.Behaviors.Add( AppendExtraHeadersHttpBehavior );
  }
}

private static readonly AppendExtraHeadersHttpBehavior AppendExtraHeadersHttpBehavior = new AppendExtraHeadersHttpBehavior();

Заранее спасибо!


person Jacques Bourque    schedule 29.01.2014    source источник


Ответы (2)


Добавьте атрибут [Query(HasSideEffects=true)] к своим методам WCF RIA IQueryable и [Invoke(HasSideEffects=true)] к своим методам WCF RIA Invoke, и все готово.

person marce    schedule 06.02.2014
comment
Спасибо!!! Это решило проблему. Вопрос, однако, что изменится, если установить для HasSideEffects значение true? Я знаю, что это повлияет на веб-кеширование, но есть ли что-нибудь еще? - person Jacques Bourque; 06.02.2014
comment
Метод http будет POST. Возможно, вы захотите рассмотреть различия между методами GET и POST http. Во-первых, вы не передаете свои параметры как часть URL-адреса. - person marce; 10.02.2014
comment
Спасибо, я посмотрю на это. - person Jacques Bourque; 11.02.2014

Мы столкнулись с той же проблемой после расширения нашего контекста RIA, включив в него несколько настраиваемых значений заголовков. Я попытался применить обходной путь HasSideEffects=true к нашим методам службы домена, но это не решило проблему. Решение совершенно не связанной проблемы фактически решило эту проблему для меня.

Наше приложение Silverlight основано на довольно старом шаблоне проекта Visual Studio, поэтому HTML DOCTYPE был установлен на XHTML 1.1:

<!DOCTYPE html PUBLIC "-//W3C/DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml2-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
...
</html>

Я начал видеть ошибки Javascript, связанные с функцией Visual Studio Browser Link. Изучение этого привело меня к другому сообщению SO о том, что Visual Studio 2013 не очень хорошо работает с переходным DOCTYPE. Согласно этому сообщению, я переключился на размещение страницы ASPX, чтобы использовать HTML5 DOCTYPE, и удалил пространство имен XML из элемента HTML на странице, чтобы исправить проблему со ссылкой на браузер.

Новая разметка страницы выглядит так:

<!DOCTYPE html>
<html>
...
</html>

При тестировании других регрессий я заметил, что это изменение также устранило ошибки типа контента в Chrome.

person Dylan Bourque    schedule 05.06.2014