所以,当我使用FaultException
时,我注意到BasicHttpBinding
没有给我正确的结果。当我使用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 &amp ;;测试以下代码时,它给出了不同的结果。 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 :(得分: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>
如果使用this tool转换默认的basicHttpBinding:您将获得:
<!-- 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到您的服务,它将起作用