4

所以,我注意到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。问题出在哪里?谁可以帮我这个事。

当我使用BasicHttpBindingWSHttpBinding绑定测试以下代码时,它给了我不同的结果。

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
}

编辑

但是,这篇文章说,您可以根据用户的语言设置提供许多不同的文本字符串。Translations 存储桶包含所有不同的文本字符串及其相关的文化标识符(由 FaultReasonText 绑定在一起)。当由于故障原因或翻译搜索未指定文化时,假定的文化是当前线程文化。例如,如果您想要翻译成“en-UK”,我们将首先查找“en-UK”,然后再查找“en”。如果我们仍然找不到匹配项,那么我们将采用列表中的第一个翻译,它可以是任何内容。

如果是这样,为什么如果WsHttpBinding它返回我 2 FaultReasonText

4

1 回答 1

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>

如果您使用此工具转换默认的 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,它将起作用

于 2013-03-15T00:15:35.820 回答