これは機能するはずです(下記の例を参照)。あなたが得る完全な例外は何ですか?
public class StackOverflow_6966835
{
[DataContract()]
public class MyClass
{
[DataMember()]
public Dictionary<string, List<string>> dictionary = new Dictionary<string, List<string>>();
}
[ServiceContract]
public interface ITest
{
[OperationContract]
MyClass GetMyClass();
}
public class Service : ITest
{
public MyClass GetMyClass()
{
return new MyClass
{
dictionary = new Dictionary<string, List<string>>
{
{ "one", "uno un eins".Split().ToList() },
{ "two", "dos deux zwei".Split().ToList() },
{ "three", "tres trois drei".Split().ToList() }
}
};
}
}
public static void Test()
{
Console.WriteLine("Stand-alone serialization");
MemoryStream ms = new MemoryStream();
MyClass c = new Service().GetMyClass();
DataContractSerializer dcs = new DataContractSerializer(typeof(MyClass));
dcs.WriteObject(ms, c);
Console.WriteLine("Serialized: {0}", Encoding.UTF8.GetString(ms.ToArray()));
Console.WriteLine();
Console.WriteLine("Now using in a service");
string baseAddress = "http://" + Environment.MachineName + ":8000/Service";
ServiceHost host = new ServiceHost(typeof(Service), new Uri(baseAddress));
host.AddServiceEndpoint(typeof(ITest), new BasicHttpBinding(), "");
host.Open();
Console.WriteLine("Host opened");
ChannelFactory<ITest> factory = new ChannelFactory<ITest>(new BasicHttpBinding(), new EndpointAddress(baseAddress));
ITest proxy = factory.CreateChannel();
Console.WriteLine(proxy.GetMyClass());
((IClientChannel)proxy).Close();
factory.Close();
Console.Write("Press ENTER to close the host");
Console.ReadLine();
host.Close();
}
}
エラーは、「パイプを読み取るときにエラーが発生しました:認識できない例外109(0x6d)」(英語に翻訳)のようなものです。ところで、私はNetNamedPipeBindingを使用しています。 – Peladao
何らかの理由でサーバがチャネルを閉じた可能性があります。クライアントとサーバーの両方でトレースを有効にしてみてください。トレースにはその理由が含まれているはずです。 – carlosfigueira
問題が見つかりました。あなたが言ったように、それはうまくいくはずで、実際には自分自身のコード例が間違っていたわけではありません。しかし、その例は明らかに単純化されており、問題は実際のコードにありました。 (私は誤って、[DataContract]またはKnownTypeとマークされていないワイヤで継承型を送信しようとしていました)。それがうまくいったはずの安心感ありがとう! – Peladao