2013-03-14 41 views
4

因此,我注意到FaultException在使用BasicHttpBinding時沒有給出正確的結果。當我使用WSHttpBinding它工作文件。FaultException在使用BasicHttpBinding時無法正常工作

的問題是,從WCF服務,如果我扔FaultException像下面,

var translations = new List<FaultReasonText> { new FaultReasonText("FaultReasonText 1"), new FaultReasonText("FaultReasonText 2") }; 

throw new FaultException<MessageServiceFault>(MessageServiceFault.Fault1, new FaultReason(translations)); 

當它達到向客戶端fault.Reason.Translations計數爲1。這意味着第一個(FaultReasonText 1)只找回給客戶。

但是,當我使用WSHttpBinding計數是2.問題是什麼?誰可以幫我這個事。

它給了我不同的結果,當我和basicHttpBinding的 & WsHttpBinding的綁定測試下面的代碼。

class Program 
{ 
    static void Main(string[] args) 
    { 
     try 
     { 
      string baseAddress = "http://" + Environment.MachineName + ":8000/Service"; 
      ServiceHost host = new ServiceHost(typeof(MessageService), new Uri(baseAddress)); 
      host.AddServiceEndpoint(typeof(IMessageService), new WSHttpBinding(), ""); 
      host.Open(); 
      Console.WriteLine("Host opened"); 

      ChannelFactory<IMessageService> myChannelFactory = new ChannelFactory<IMessageService>(new WSHttpBinding(), new EndpointAddress(baseAddress)); 
      IMessageService channel = myChannelFactory.CreateChannel(); 
      var response = channel.GetMessage(); 
     } 
     catch (FaultException fault) 
     { 
      fault.Reason.Translations.ToList().ForEach(i => Console.WriteLine(i.Text)); 
      Console.WriteLine(false); 
     } 
    } 
} 

[ServiceContract] 
public interface IMessageService 
{ 
    [OperationContract] 
    [FaultContract(typeof(MessageServiceFault))] 
    string GetMessage(); 
} 

public class MessageService : IMessageService 
{ 
    public string GetMessage() 
    { 
     var translations = new List<FaultReasonText> { new FaultReasonText("FaultReasonText 1"), new FaultReasonText("FaultReasonText 2") }; 

     throw new FaultException<MessageServiceFault>(MessageServiceFault.Fault1, new FaultReason(translations)); 
    } 
} 

[DataContract] 
public enum MessageServiceFault 
{ 
    [EnumMember] 
    Fault1, 

    [EnumMember] 
    Fault2 
} 

編輯

但是,這article說,你可以提供一個數字,從獲得根據用戶的語言設置不同採摘的文本字符串。 Translations桶保存所有不同的文本字符串及其相關的文化標識符(通過FaultReasonText連接在一起)。當沒有針對故障原因或翻譯搜索指定文化時,假定的文化就是當前的線索文化。例如,如果您想要翻譯爲「en-UK」,我們首先會查找「en-UK」,然後我們會查找「en」。如果我們仍然無法找到匹配,那麼我們會在列表中找到第一個翻譯,這可能是任何事情。

如果是這樣,爲什麼在WsHttpBinding的情況下返回我2 FaultReasonText

回答

0

要使用FaultException,您需要在Web服務上激活SOAP 1.2。

BasicHttpBinding使用SOAP 1.1,WSHttpBinding使用SOAP 1.2。這就是爲什麼它與WSHttpBinding協同工作,而不是與BasicHttpBinding協同工作。

而不是使用basicHttpBinding的,你應該更好地利用customBindings,與textMessageEncoding和httpTransport:

<customBinding> 
    <binding name="simpleBinding"> 
     <textMessageEncoding messageVersion="Soap12" writeEncoding="utf-8" /> 
     <httpTransport /> 
    </binding> 
</customBinding> 

如果轉換默認basicHttpBinding的與this tool:你將獲得:

<!-- generated via Yaron Naveh's http://webservices20.blogspot.com/ --> 
<customBinding> 
    <binding name="NewBinding0"> 
     <textMessageEncoding MessageVersion="Soap11" /> 
     <httpTransport /> 
    </binding> 
</customBinding> 
<!-- generated via Yaron Naveh's http://webservices20.blogspot.com/ --> 

源綁定:

<bindings> 
    <basicHttpBinding> 
     <binding name="NewBinding0" /> 
    </basicHttpBinding> 
</bindings> 

試試激活SOAP 12到您的服務,它將工作

+1

-1:這是不正確的。 'basicHttpBinding'也支持SOAP 1.2。 – 2013-03-15 01:16:35

+1

@JohnSaunders,RomEh的回答不正確。但我想basicHttpBinding不支持SOAP 1.2。閱讀本文http://msdn.microsoft.com/en-us/library/ms731361.aspx – 2013-03-15 03:27:11

+1

我不信任我,只是看看這個工具:http://webservices20.cloudapp.net/default。 ASPX。 – 2013-03-15 13:05:36