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
ですか?