現在、サーバークライアントプログラムを実現しようとしています。このプロジェクトで使用されるモデルは共有アセンブリで定義され、属性でマークされていますDataContract
。サーバーはクライアントと同様にそれらを使用する必要があるため、コードを 2 回生成する必要はありません。クライアントがサーバーへのリクエストを開始すると、共有モデルのインスタンスを返して、メソッドとコンストラクター、およびデータを使用できるようにする必要があります。
サーバーは、WCF サービスで実現されます。クライアント側では、.wsdl ファイル経由ではなく、channelfactory 経由でデータを取得する必要があります。
クライアント側:
private void TestSzenarioOne()
{
var address = new EndpointAddress($"http://{Host}:{Port1}/{ServiceName}");
var binding = new BasicHttpBinding();
var factory = new ChannelFactory<ITestInterface>(binding, address);
var channel = factory.CreateChannel();
var test1 = channel.DoStringTest(); // <-- works fine
var test2 = channel.DoStringEnumerableTest(); // <-- works fine
var test3 = channel.DoTest(); // <-- want to get List<User> error!!!!
}
サービス契約共有ライブラリ:
[ServiceContract]
public interface ITestInterface: IDisposable
{
[OperationContract]
IEnumerable<User> DoTest();
[OperationContract]
string DoStringTest();
[OperationContract]
IEnumerable<User> DoStringEnumerableTest();
WCF サービスからの接続が開いており、url 経由でサービスにアクセスできます。
サーバーからモデル オブジェクトを取得できないのはなぜですか? 何か案が:
エラー: 通信例外
http://localhost:1800/testService サービスの HTTP 応答を受信中にエラーが発生しました。サービス エンドポイント バインディングが HTTP プロトコルを使用していないことが原因である可能性があります。もう 1 つの考えられる原因は、HTTP 要求コンテキストがサーバーによって中止されたことです (おそらく、サービスのシャットダウンが原因です)。詳細については、サーバー ログを参照してください。"
ユーザークラス:
[KnownType(typeof(Entity))]
[DataContract]
public class User : Entity
{
[DataMember]
public string Name { get; set; }
[DataMember]
public string ShortName { get; set; }
[DataMember]
public string Password { get; set; }
}
実在物:
[DataContract]
public class Entity
{
[DataMember]
public long Id { get; } = 0;
}