2013-03-14 2 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 
} 

EDIT:

Но это article говорит, Вы можете поставить несколько различных текстовых строк, которые получают из отборных в зависимости от языковых настроек пользователя. Ведро Translations содержит все текстовые строки и связанные с ними культурные идентификаторы (связанные FaultReasonText). Если культура не указана для причины сбоя или поиска перевода, предполагаемая культура является текущей культурой потока. Например, если вам нужен перевод в «en-UK», мы сначала будем искать «en-UK», а затем будем искать «en». Если мы все еще не сможем найти совпадение, мы возьмем первый перевод в списке, который может быть чем угодно.

Если да, то почему в случае WsHttpBinding он возвращает мне 2 FaultReasonText?

ответ

0

Чтобы использовать FaultException, вам необходимо активировать 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. –

+1

@JohnSaunders, RomEh ответ неправильный. Но я думаю, что basicHttpBinding не поддерживает SOAP 1.2. Прочтите это http://msdn.microsoft.com/en-us/library/ms731361.aspx –

+1

Я вам не доверяю, просто взгляните на этот инструмент: http://webservices20.cloudapp.net/default. ASPX. –