2014-01-29 28 views
1

我想爲從我的Silverlight應用程序到RIA DomainService的每個請求添加自定義標頭。Silverlight + Google Chrome +自定義請求標頭=>內容類型錯誤

我這樣做是通過在域客戶端的端點的行爲集合中添加一個自定義行爲。

我的行爲然後添加一個自定義的MessageInspector,它將我的自定義標頭設置爲請求。

這一切工作正常在IE瀏覽器,但在谷歌瀏覽器,我收到一個異常說:「...內容類型text/plain; charset = x用戶定義的響應消息不匹配的內容類型綁定(應用程序/ 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(); 

在此先感謝!

回答

2

向您的WCF RIA IQueryable方法添加[Query(HasSideEffects = true)]屬性,並且向您調用[Invoke(HasSideEffects = true)] WCF RIA調用方法和您的好消息。

+0

謝謝!它確實解決了這個問題。但是,問題在影響「HasSideEffects」爲true時會發生什麼變化?我知道它會對網頁緩存產生影響,但還有其他什麼嗎? –

+0

http方法將是POST。您可能想要考慮GET和POST http方法之間的差異。一個是你沒有傳遞你的參數作爲URL的一部分。 – marce

+0

謝謝,我會研究一下。 –

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名稱空間以修復Browser Link問題。

新頁面標記看起來是這樣的:

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

在測試其他的迴歸,我注意到,這一變化也解決在Chrome中的內容類型錯誤。