Silverlight + Google Chrome +自定义请求标头=>内容类型错误

时间:2014-01-29 19:53:37

标签: silverlight ria

我想为从Silverlight应用程序发送到RIA DomainService的每个请求添加自定义标头。

我是通过在域客户端的端点的行为集合中添加自定义行为来实现的。

我的行为然后添加一个自定义MessageInspector,它将我的自定义标头设置为请求。

这一切在IE浏览器中运行良好,但在谷歌浏览器中,我得到一个例外说:“......内容类型text / plain; charset = x-user-defined of response message与内容类型不匹配绑定(application / msbin1)...“。

有没有人成功将自定义标头添加到RIA服务请求并使其在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();

提前致谢!

2 个答案:

答案 0 :(得分:2)

将[Query(HasSideEffects = true)]属性添加到您的WCF RIA IQueryable方法,并将[Invoke(HasSideEffects = true)]添加到WCF RIA调用方法和您的好处。

答案 1 :(得分:0)

在扩展我们的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>

我开始看到与Visual Studio的浏览器链接功能相关的Javascript错误。研究让我想到了另一篇关于Visual Studio 2013的SO帖子,并没有很好地使用过渡DOCTYPE。根据该帖子,我切换到托管ASPX页面以使用HTML5 DOCTYPE并从页面上的HTML元素中删除XML命名空间以修复浏览器链接问题。

新页面标记如下所示:

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

在测试其他回归时,我注意到此更改还解决了Chrome中的内容类型错误。