2

私はWCFサービスに取り組んでいます。サービス操作が 1 つありますFunction getValues(Optional verbose as Boolean) as List(of String)

これは機能します:

' まず、iRM インターフェイスを含むファイル参照を追加します。
Dim ep3 As EndpointAddress
ep3 = New EndpointAddress("net.pipe://localhost/RM/RMPipe")
Dim netPipeRMClient As RMLib.iRM netPipeRMtClient = ChannelFactory(Of RMLib.iRM) _ .CreateChannel(New NetNamedPipeBinding, ep3)

dim foo as List(of String) = netPipeRMClient.getValues()

ただし、これは機能しません。

' Add Service Reference を使用してクライアント タイプを取得します... Dim ep3 As EndpointAddress
ep3 = New EndpointAddress("net.pipe://localhost/RM/RMPipe")
dim netPipeRMClient as RM.iRMClient = _
new RM.IRMClient(New NetPipeBinding、ep3)
List(of String) = netPipeRmClient.getValues() としての Dim foo

最後の行で、「パラメーターに引数が指定されていません」というコンパイル時エラーが発生しますverbose

パラメータは、verboseメソッド シグネチャではオプションとして明確に定義されていましたが、WCF サービス コントラクトでは、「サービス参照の追加」で作成したクライアントを使用すると、オプションではないようです。

何か案は?

4

2 に答える 2

3

オプションのパラメーターは .NET 固有の機能です。WCF サービスは本質的に相互運用可能であるため、.NET 固有の機能に依存することはできません。

WCF で交換するものはすべて、XML スキーマと WSDL に基づいています。私の知る限り、WSDL はオプションのパラメーターをサポートしていません。WCF とその基盤となる配管は、これらのことを認識していないため、WCF サービスでそれらを使用することはできません。

WCF サービス呼び出しでオプションのパラメーターを使用しない方法を見つける必要があります。

WCF / SOA がうまく機能しないいくつかの追加事項がありますが、OOP/.NET ではまったく問題ありません - 演算子のオーバーロード、インターフェイス、ジェネリックなど - WCF は次のように設計されていることを常に考慮する必要があります。相互運用可能な SOA プラットフォーム。たとえば、PHP、Ruby などの他の言語やシステムと通信できる必要があります。.NET のすべての機能をサポートしていないものもあります。

SOA と OOP は時々対立します - それは単なる現実です。SOA と WCF を使用する場合 (私はそのアプローチを強く主張します)、「SOA の方法で行う」必要があります。たとえそれが .NET でできることや、 OOP プラクティスが示唆する場合があります。

于 2010-06-29T20:37:01.417 に答える
0

ChannelFactory<...>の代わりにを使用する場合は、次のAdd Service Referenceようなことができます (既存のサービス コントラクト インターフェイスを再利用します)。

... 契約 ...

[ServiceContract]
public interface IService1
{
    [OperationContract]
    string Echo(string input = "Default!!!");
}

... 使用法 ...

// you can still provide most of these values from the app.config if you wish
// I just used code for this example.

var binding = new BasicHttpBinding();
var factory = new ChannelFactory<IService1>(binding);
var endpoint = new EndpointAddress("http://localhost:8080/service1");
var channel = factory.CreateChannel(endpoint);
var resultDefault = channel.Echo();
var resultInput = channel.Echo("Input");
于 2010-06-29T21:15:45.647 に答える