web-dev-qa-db-ja.com

実行時にURLを介してWCF Webサービスを使用する方法

URLを介してサービスで公開されているすべてのメソッドにアクセスしたい。 URLが次のような場合:

http://localhost/MyService/MyService.svc

メソッドにアクセスするにはどうすればよいですか。

  1. serviceReferenceがあると仮定した場合
  2. サービスリファレンスがない場合はどうすればよいですか。
15
Ashish Ashu

WCFサービスを使用するには、WCFクライアントプロキシを作成する必要があります。

Visual Studioでは、プロジェクトを右クリックして、コンテキストメニューから[サービス参照の追加]を選択します。接続するURLを入力すると、そのサービスが実行されている場合は、クライアントプロキシファイルが生成されます。

このファイルには通常、MyService Clientと呼ばれるクラスが含まれます-そのクラスをインスタンス化でき、自由にそのクライアントクラスで使用可能なすべてのメソッドを確認できます。

Visual Studioでサービス参照を追加したくない場合は、svcutil.exeコマンドラインツールを実行して同じ結果を得ることができます。これにより、クライアントプロキシクラスに必要なすべてのファイルも生成されます。

マーク

更新:
実行時にクライアントプロキシを初期化する場合は、確実にそれを行うことができます。使用するバインディング(トランスポートプロトコル)と接続するアドレスを決定する必要があります。その後、次のことができます。

BasicHttpBinding binding = new BasicHttpBinding();
EndpointAddress address = new EndpointAddress("http://localhost:8888/MyService");

MyServiceClient serviceClient = new MyServiceClient(binding, address);

ただし、この場合でも、「サービス参照の追加」またはsvcutil.exeツールを使用して、最初にプロキシクライアントをインポートして作成する必要があります。

21
marc_s

サービス参照なしでそれを行う方法に答えること。こちらをご覧ください(オプション#a):

最初のWCFクライアントを作成する

まだいくつかの参照(つまり、コントラクト/インターフェイスを含むアセンブリへの参照)が必要ですが、サービス参照は作成しません。

EDIT:上記は可能ですが、お勧めしません。このようなプロキシを生成する必要がある場合、パフォーマンスは正確ではありません。通常、svcutil.exeを使用して、クライアントを含むアセンブリを作成し、そのアセンブリへの参照を作成します。これにより、プロキシの外観を制御するためのオプションが増えます。

8
Stefan Egli

WebClient クラスを使用して、サービスプロキシを必要とせずにWCFサービスを呼び出すこともできます。事実上、文字列とバイナリデータを送受信し、POSTをシミュレートすることもできます。

私は、開発者が必要なプロキシメソッドを作成しない可能性がある再利用可能なコンポーネントに幅広く使用しています。 POSTを実行する方法の適切な比較が利用可能です ここ

2
BinaryMisfit

あなたはそれを/ functionnameで呼び出します、例えば:

http://localhost/MyService/MyService.svc/ GetVersionNumber

enter image description here

編集:

ブラウザーから直接呼び出すことができるように、WCFサービスでメソッドをどのように構成しますか?

私はインターフェースを持っています:

[ServiceContract]
public interface IWebServiceImpl
{
    [OperationContract]
    [WebInvoke(Method = "GET",
        ResponseFormat = WebMessageFormat.Json,
        BodyStyle = WebMessageBodyStyle.Bare,
        UriTemplate = "GetVersionNumber")]
    string GetVersionNumber();

そして、インターフェイスにGetVersionNumberメソッドを実装するクラス:

public class WebServiceImpl
{
    public string GetVersionNumber()
    {
            return "1.0.0.0"; //In real life this isn't hard-coded
    }
}

最後に、Web.configの構成を次に示します。

<system.serviceModel>        
    <diagnostics>
      <messageLogging logEntireMessage="true" logMalformedMessages="false" logMessagesAtServiceLevel="true" logMessagesAtTransportLevel="false" maxMessagesToLog="3000" maxSizeOfMessageToLog="2000"/>
    </diagnostics>        
    <bindings>
      <webHttpBinding>
        <binding name="webBinding">
          <security mode="Transport"/>
        </binding>
      </webHttpBinding>
    </bindings>
    <services>
      <service behaviorConfiguration="ServiceBehaviour" name="YOURWebServiceNameSpace.WebServiceImpl">            
        <endpoint address="" behaviorConfiguration="web" binding="webHttpBinding" contract="YOURWebServiceNameSpace.IWebServiceImpl"/>
      </service>
    </services>
    <behaviors>
      <serviceBehaviors>
        <behavior name="ServiceBehaviour">
          <!-- To avoid disclosing metadata information, set the value below to false and remove the metadata endpoint above before deployment -->
          <serviceMetadata httpGetEnabled="true"/>
          <!-- To receive exception details in faults for debugging purposes, set the value below to true.  Set to false before deployment to avoid disclosing exception information -->
          <serviceDebug includeExceptionDetailInFaults="false"/>
        </behavior>
      </serviceBehaviors>
      <endpointBehaviors>
        <behavior name="web">
          <webHttp/>
        </behavior>
      </endpointBehaviors>
    </behaviors>
    <serviceHostingEnvironment multipleSiteBindingsEnabled="true"/>
  </system.serviceModel>
  <system.webServer>
    <modules runAllManagedModulesForAllRequests="true"/>
  </system.webServer>
1
Jeremy Thompson

あなたはあなたのサービスのwsdlを提供することができます: http://localhost/MyService/MyService.svc?wsdl

Wsdlからプロキシクラスを生成し、クライアントで使用できます。

0
sandyiit