【问题标题】:FaultException is not working correct when using BasicHttpBinding使用 BasicHttpBinding 时,FaultException 无法正常工作
【发布时间】: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


    【解决方案1】:

    要使用 FaultException,您需要在 Web 服务上激活 SOAP 1.2。

    BasicHttpBinding 使用 SOAP 1.1,WSHttpBinding 使用 SOAP 1.2。这就是为什么它适用于 WSHttpBinding 而不适用于 BasicHttpBinding。

    您最好使用 customBindings,而不是使用 BasicHttpBinding,使用 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,它会起作用

    【讨论】:

    猜你喜欢
    • 2018-10-29
    • 2020-07-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-01
    • 1970-01-01
    • 2016-10-28
    相关资源
    最近更新 更多