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 になります。これは、最初の 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
}

編集

ただし、この記事では、ユーザーの言語設定に応じて選択されるさまざまなテキスト文字列を指定できます。Translations バケットには、さまざまなテキスト文字列とそれに関連する文化的識別子 (FaultReasonText によって結び付けられている) がすべて保持されます。フォルトの理由または翻訳検索でカルチャが指定されていない場合、想定されるカルチャは現在のスレッド カルチャです。たとえば、「en-UK」への翻訳が必要な場合は、まず「en-UK」を検索し、次に「en」を検索します。それでも一致するものが見つからない場合は、リストの最初の翻訳を取得します。これは何でもかまいません。

もしそうなら、なぜWsHttpBindingそれが私に 2 を返すのFaultReasonTextですか?

4

1 に答える 1

0

FaultExceptionを使用するには、WebサービスでSOAP1.2をアクティブ化する必要があります。

BasicHttpBindingはSOAP1.1を使用し、WSHttpBindingはSOAP1.2を使用します。これが、BasicHttpBindingではなくWSHttpBindingで機能する理由です。

BasicHttpBindingを使用する代わりに、textMessageEncodingとhttpTransportを使用してcustomBindingsを使用することをお勧めします。

<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>

サービスに対してSOAP12をアクティブ化してみてください。そうすれば、機能します。

于 2013-03-15T00:15:35.820 に答える