WCFに問題があります。私は問題の内容を理解していると思いますが、その理解をテストし、以前に誰かがこれを見たことがあるか尋ねるか、 回避策または別の方法を提案することができます。私には負担してください:これは、最小限のテストケースに分解するのが難しい大きな問題です( )。WCFタイプの衝突
問題:私はレガシーメッセージングシステムにC#インターフェイスを作成しています。私は 直接インターフェイス用のinteropアセンブリを実装し、すべて正常に動作します。 の基本は、私は各メッセージタイプのクラスを持っており、その周りを渡すための汎用クラス は、最大サイズのメッセージと同じスペースを占めるだけです。
各メッセージクラスは、この 汎用クラス(QOD_Message)に出入りするキャスト演算子を実装します。ジェネリッククラスと個々のメッセージ クラスは、どちらもボディレスの最小メッセージクラスから派生しています。 メッセージを送信したいクライアントのC#アプリは、 がQOD_Messageを受け取り、送信用ジェネリック型にキャストするインターフェイスアセンブリ内のsendメソッドを呼び出します。受信者イベント は受信C#アプリケーションにメッセージタイプと1対1の関係を持つ共通の メンバーに従ってキャストされるジェネリックタイプを渡します。
私はローカルダイレクトインターフェイスアセンブリを実装しました。これはすべてうまく動作します。 これで、C#テストアプリケーションと既存のネイティブレガシー アプリケーションの間でメッセージを送信できるようになりました。素晴らしい。基本クラス構造は次のようになります。
public class QOD_Message_Minimal
{
a message header
}
public class QOD_Message : QOD_Message_Minimal
{
generic message - defines an empty body
}
public class QOD_WcfDialout : QOD_Message_Minimal
{
... some irrelevant code
// cast operators to convert to and from the abstract message class.
public static implicit operator QOD_Message (QOD_WcfDialout m)
{
... some irrelevant code
}
public static implicit operator QOD_WcfDialout (QOD_Message m)
{
... some irrelevant code
}
}
キャスト演算子に注意してください。
今問題が発生します。このインターフェイスをWCFをサポートするように拡張したいので、 海外の開発者の別のグループは、WCF経由でアダプタ WCFサービスを使って通信できます。これは、想像を絶するものとして、 の想像力が欠けていると呼ばれ、WCF_Adapterです。 WCF_Adapterは、テスト目的のために文字列(Dialout)を受け取る単一のメソッド を公開し、これを のレガシーコードのメッセージに変換します。これは正常に機能し、私の WCF_Clientアプリケーションの関数呼び出しをレガシーメッセージに変換し、 (固定)受信者に送信しても機能します。
だから私は、これは直接 インタフェースと同じように動作することを期待して、送信者が自分にメッセージを投じるすなわち、 QOD_Message(派遣)を受け入れるだろうエントリポイントを追加するには、インターフェイスを拡張しようとしましたこのタイプの送信機能を と呼びます。アダプタは、 ディスパッチ用のローカルインターフェイスアセンブリに 受信汎用メッセージを渡します。したがって、WCFコードは通常のメッセージング コードとほとんど同じように見えます。
[ServiceContract]
public interface IDialout
{
[OperationContract (IsOneWay = true)]
void Dialout (string NumberToDial);
[OperationContract (IsOneWay = true)]
void Dispatch (QOD_Message msg);
}
だから私はああ.... WCFクライアントの 私のプロキシコードを生成し、クライアントとWCF_adapterサービスを拡張します。クライアントはコンパイルされません。
クライアントアプリケーションがキャスト演算子を認識できず、 コンパイルエラーがスローされたようです。 のコードを持つメッセージングアセンブリを参照として含める場合でも、クライアントコードは生成された プロキシで定義された型を「優先」し、元のメッセージ型を無視するため、キャストを「見る」ことができず、 はコンパイル。これはエラーです:
警告CS0436: インポートタイプ の 'QOD_Messaging.QOD_Message'「何とか-何とかの\ QOD_Messagingと '何とか、何とかの\ generatedProxy.cs' 紛争で型 'QOD_Messaging.QOD_Message'。 dll '。 'blah-blah \ generatedProxy.cs'で定義された型を使用しています。
私が言うことができる限り、生成されたプロキシで定義されたクラスは正しいです。 もちろん、生成されたプロキシクラスは、機能ではなくデータメンバーのみを定義します。 それは私がアセンブリ参照を残すことができますので、コードがキャストを見ると、コンパイルに を失敗することはできません、または私は残すことができます.....だから、
を二つのクラス
[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.CodeDom.Compiler.GeneratedCodeAttribute("System.Runtime.Serialization", "3.0.0.0")]
[System.Runtime.Serialization.DataContractAttribute(Name="QOD_Message_Minimal", Namespace="http://schemas.datacontract.org/2004/07/QOD_Messaging")]
[System.Runtime.Serialization.KnownTypeAttribute(typeof(QOD_Messaging.QOD_Message))]
public partial class QOD_Message_Minimal : object, System.Runtime.Serialization.IExtensibleDataObject
{
whole slew of data members.
}
[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.CodeDom.Compiler.GeneratedCodeAttribute("System.Runtime.Serialization", "3.0.0.0")]
[System.Runtime.Serialization.DataContractAttribute(Name="QOD_Message", Namespace="http://schemas.datacontract.org/2004/07/QOD_Messaging")]
public partial class QOD_Message : QOD_Messaging.QOD_Message_Minimal
{
extra stuff to define the added body.
}
が含まれていますコンパイラはアセンブリの型定義 を故意に無視し、プロキシ定義を使用してコンパイルに失敗します。
これまで他のWCF開発者にこのようなことを見たことがありますか?あるいは、誰もWCFエンドポイントを呼び出すときに、 を単純な値のパラメータに張っていますか?私はちょうど 私は メッセージを送信する可能性のあるすべての種類のメッセージの一意のクラスパラメータを持つエンドポイントを宣言する必要がありますか?これはメンテナンスの悪夢です。
優秀 - 私はこのC#larkで恐ろしい初心者である/ rフラグの使用を考えていませんでした。それがトリックでした。どうもありがとう。 –