【发布时间】:2013-03-03 07:09:31
【问题描述】:
所以,当我使用BasicHttpBinding 时,我注意到FaultException 没有给我正确的结果。当我使用WSHttpBinding 时,它可以工作文件。
问题是,如果我像下面这样抛出 FaultException,来自 WCF 服务,
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?
【问题讨论】:
标签: wcf wcf-binding