3

WCFを使用して作成されたサービスと通信するためのDelphiクライアント(Delphi 2006)を作成しようとしています。サービスはたった1つの機能でとてもシンプルです。技術的には以下のように:

[ServiceContract (Namespace = "http://www.company.com/sample/")]
public interface IService
{
    [OperationContract]
    string GetNumber (string name);
}

このサービスをIISでホストし、mexエンドポイントでbasicHttpBindingを使用して公開しました。.NETクライアントで使用できます。

WSDLImp.exeを実行しようとすると、ソースコードユニットが生成されました(ところで、文字列型をカプセル化するための奇妙なクラスが生成されます。Delphiの文字列型と同じにできないのはなぜですか?)。このサービスを呼び出そうとすると、例外が発生します。

EndpointDispatcherでのContractFilterの不一致が原因で、アクション''を含むメッセージを受信者で処理できません。これは、コントラクトの不一致(送信者と受信者の間のアクションの不一致)または送信者と受信者の間のバインディング/セキュリティの不一致が原因である可能性があります。送信者と受信者が同じコントラクトと同じバインディング(メッセージ、トランスポート、なしなどのセキュリティ要件を含む)を持っていることを確認します。

バインディングまたはセキュリティパラメータを変更するようにDelphiWin32クライアントを設定する方法がわかりません。この問題を解決するにはどうすればよいですか?

4

2 に答える 2

3

私はまったく同じ問題を抱えていました。Delphiは、WCFによって公開されたWSDLをインポートするのに苦労しています。1つの解決策は、ASMXラッパーをサービスに追加し、それをDelphiクライアントで使用することです。

次に例を示します。

[ServiceContract (Namespace = "http://www.company.com/sample/")]
public interface IService
{
    [OperationContract]
    string GetNumber (string name);
}

public class Service : IService
{
    public string GetNumber (string name)
    {
        return Repository.GetNumber(name);
    }
}

[WebService(
    Namespace = "http://www.company.com/sample/",
    Name = "wstest",
    Description = "description")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
public class AsmxService : WebService
{
    [WebMethod]
    public string GetNumber(string name)
    {
        return Repository.GetNumber(name);
    }
}
于 2009-07-07T06:06:51.647 に答える
2

何が起こっているかを確認するには、クライアントとサービス間のネットワークトラフィックを調べる必要があります。または、サービスでWCFトレースをオンにします。これには、メッセージトレースも含まれる場合があります。何が起こっているのかを非常に詳細に見ることができるはずです。

于 2009-07-09T00:54:48.753 に答える