使用BasicHttpBinding时,FaultException无法正常工作

时间:2013-03-14 18:44:49

标签: wcf wcf-binding

所以,当我使用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

1 个答案:

答案 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到您的服务,它将起作用