2012-09-04 54 views
1

在閱讀了更多關於它並試圖實施wshttpbinding後,它就不會發生。無論我嘗試什麼,我都會收到以下錯誤消息(安全模式已註釋掉)。我明白爲什麼,因爲綁定之間的SOAP版本不同。使用wsHttpBinding

「(415)無法處理該消息,因爲該內容類型 '應用/肥皂+ xml的;字符集= UTF-8' 是不預期的類型 '文本/ XML;字符集= UTF-8'」

我在下面的鏈接閱讀更多關於TransportWithMessageCredentials:

http://msdn.microsoft.com/en-us/library/ms789011.aspx

但還是沒能得到它的工作。

我可以使用basicHttpBinding對內部應用程序很好,並且效果很好(如果我不包含任何事務),但是我的WCF層中的應用程序仍然需要支持事務(參見下文),從中我明白了basicHttpBinding不支持,因爲它不包含事務流屬性。

[OperationContract] 

[TransactionFlow(TransactionFlowOption.Allowed)] 

using (TransactionScope ts = new TransactionScope(TransactionScopeOption.Required)) 

當我嘗試和運行下面包括安全模式,在SVC配置編輯器甚至不啓動並引發以下錯誤:「System.InvalidOperationException:找不到匹配方案的基址https綁定WSHttpBinding的端點,註冊的基地址方案是[http]。「

我知道它期望某種SSL/HTTPS安全,但我的網站(正如你可以看到下面是http)。對於面向公衆的網站來說,這樣做會很好,但對於內部網站而言,現在,我想要做的就是支持交易。

這裏是我的服務器端安裝程序的wsHttpBinding:

<bindings> 
     <wsHttpBinding> 
     <binding name="WsHttpBinding_IYeagerTechWcfService" closeTimeout="00:02:00" openTimeout="00:02:00" receiveTimeout="24.20:31:23.6470000" sendTimeout="00:10:00" maxBufferPoolSize="2147483647" maxReceivedMessageSize="2147483647" transactionFlow="true"> 
      <security mode="Transport" > 
      <transport clientCredentialType = "Windows" /> 
      </security> 
     </binding> 
     </wsHttpBinding> 
</bindings> 

<?xml version="1.0"?> 
<services> 
    <clear /> 

    <service name="YeagerTechWcfService.YeagerTechWcfService"> 
    <endpoint address="" binding="wsHttpBinding" contract="YeagerTechWcfService.IYeagerTechWcfService" > 
     <identity> 
     <dns value="localhost" /> 
     </identity> 
    </endpoint> 
    <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" /> 
    <host> 
     <baseAddresses> 
     <add baseAddress="http://abc.com/yeagerte/YeagerTechWcfService.YeagerTechWcfService.svc" /> 
     </baseAddresses> 
    </host> 
    </service> 
</services> 

這裏是我的客戶端設置:

<?xml version="1.0"?> 
<client> 
    <endpoint address="http://abc.com/yeagerte/YeagerTechWcfService.YeagerTechWcfService.svc" 
    binding="wsHttpBinding" contract="YeagerTechWcfService.IYeagerTechWcfService" 
    name="WsHttpBinding_IYeagerTechWcfService" /> 
</client> 

可能有人請提供以下信息:

有另一種方式來支持WCF for basicHttpBinding或其他方式的交易?

如果是這樣,我該如何實現它?

如果不是,我的選擇是什麼?

對於上述問題,我可能已經想出了一個答案,但希望由在這個問題上更有經驗的人來運行它。

代替具有WCF層處理交易(如上面提到的),我建議我使用basicHttpBinding的和在我的控制器下面的代碼時,它在將數據傳遞到WCF層:

// method here 
using (TransactionScope ts = new TransactionScope(TransactionScopeOption.Required)) 
         { 
          db.EditCategory(cat); 
          // the above code would execute the EditCategory method below in the WCF layer and keep the transaction alive             ts.Complete(); 
          ts.Dispose(); 
         } 
         return Json(new GridModel(db.GetCategories())); 
// end method 

WCF層:

public void EditCategory(Category cat) 
     { 
      try 
      { 
       using (YeagerTechEntities DbContext = new YeagerTechEntities()) 
       { 
        Category category = new Category(); 

        category.CategoryID = cat.CategoryID; 
        category.Description = cat.Description; 

      // do another db update here or in another method... 

        DbContext.Entry(category).State = EntityState.Modified; 
        DbContext.SaveChanges(); 
       } 
      } 

      catch (Exception ex) 
      { 
       throw ex; 
      } 
     } 

對於使用SSL面向公衆的網站,我該如何正確實現的wsHttpBinding?

+0

fyi,我嘗試了一下我在控制器中使用transactionscope的選項,並且它在basicHttpBinding中正常工作。 任何其他反饋關於這個和/或其他問題關於我以前的帖子將不勝感激。 – sagesky36

回答

0

我在使用WCF事務時遇到同樣的問題 我使用Windows身份驗證的消息安全性,並且不必設置任何證書。

<wsHttpBinding> 
     <binding name="WSHttpBinding_Transactional" 
      transactionFlow="true"> 
      <security mode="Message"> 
      <transport clientCredentialType="Windows" proxyCredentialType="None" /> 
      </security> 
     </binding> 
</wsHttpBinding>