我想为从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();
提前致谢!
答案 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中的内容类型错误。