Итак, я заметил, что 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
?
-1: это неправда. 'basicHttpBinding' также поддерживает SOAP 1.2. –
@JohnSaunders, RomEh ответ неправильный. Но я думаю, что basicHttpBinding не поддерживает SOAP 1.2. Прочтите это http://msdn.microsoft.com/en-us/library/ms731361.aspx –
Я вам не доверяю, просто взгляните на этот инструмент: http://webservices20.cloudapp.net/default. ASPX. –