1

Visual Studio で WebReference を簡単に追加する方法を知っています。

また、通常の ASP.NET Web サービス プロジェクトを作成する方法も知っていますが、ここで行っているのはそれではありません。

したがって、私が実行している WebService は次のようになります。

try
{
    if (host != null)
    {
         host.Close();
         host = null;
    }
    baseAddress = new Uri("http://example.com:8080");
    host = new WebServiceHost(typeof(MyProxy), baseAddress);

    ServiceMetadataBehavior smb = new ServiceMetadataBehavior();
    smb.HttpGetEnabled = true;
    host.Description.Behaviors.Add(smb);

    host.Opened += new EventHandler(host_Opened);
    host.Closed += new EventHandler(host_Closed);

    System.ServiceModel.Description.ServiceEndpoint se = host.AddServiceEndpoint(typeof(IMyProxy), new WebHttpBinding(), baseAddress);
    se.Behaviors.Add(new System.ServiceModel.Description.WebHttpBehavior());
    host.Open();
 }
 catch (Exception e)
 {
 }

 // .... stuff ....

[ServiceContract]
public interface IMyProxy
{
    [OperationContract]
    [WebGet(UriTemplate = "GetArea?searchString={searchString}")]
    GetAreaResult GetArea(string searchString);
}

// more stuff of course follows here

問題は、Visual Studio で上記のサービスに WebReference を追加しようとすると、エラーが発生することです。

「サービス参照の追加」->「Web 参照の追加」および URL に自分の URL、http://example.com:8080を記述します。

次に、「サービス...エンドポイントが見つかりません」というメッセージが表示されます。[Web 参照の追加] ボックスのエラー メッセージ:

「 http://example.com:8080/ 」のダウンロード中にエラーが発生しました。リクエストは HTTP ステータス 404: Not Found で失敗しました。「 http://example.com:8080/ $metadata」のダウンロード中にエラーが発生しました。リクエストは HTTP ステータス 404: Not Found で失敗しました。

Web ブラウザを開いてhttp://example.com:8080/GetAreaに直接アクセスすると、サービスが期待どおりに呼び出され、実行されます。

問題を短く言い換えると、WSDL/説明がないため、Web サービス参照を追加できません。

4

3 に答える 3

4

ここでの問題は、WebServiceHostを追加するときに達成しようとしている機能が によって削除されることですServiceMetadataBehavior。で dotPeek (リフレクター) を見ると、メソッドWebServiceHost内には次のようなものがあります。OnOpening

ServiceDebugBehavior serviceDebugBehavior = this.Description.Behaviors.Find<ServiceDebugBehavior>();
  if (serviceDebugBehavior != null)
  {
    serviceDebugBehavior.HttpHelpPageEnabled = false;
    serviceDebugBehavior.HttpsHelpPageEnabled = false;
  }
  ServiceMetadataBehavior metadataBehavior = this.Description.Behaviors.Find<ServiceMetadataBehavior>();
  if (metadataBehavior != null)
  {
    metadataBehavior.HttpGetEnabled = false;
    metadataBehavior.HttpsGetEnabled = false;
  }

WebServiceHost、通常はコントラクトが定義されていない REST/JSON サービスで使用するように設計されているため、メタデータ (mex) が無効になっています。

SOAP ベースのサービスを作成しようとしている場合は、標準を使用する必要がありますServiceHost。VSを介してサービス参照を追加しようとしているので、これがあなたが望むもののようです。

REST/JSON サービスを作成しようとしている場合は、WebServiceHost.

于 2011-09-15T14:24:49.140 に答える
1

ホスト参照MSDN リファレンスに ServiceMetadataBehavior を追加する必要があります。

// Enable Mex
host.Description.Behaviors.Add(new ServiceMetadataBehavior{ HttpGetEnabled = true });
于 2011-08-16T13:34:34.670 に答える
0

Webサービス用にWSDLまたはディスコファイルを作成する必要があると思います。そのためには、Webサービスをローカルで実行します。これは、正常に実行されます。私の場合、Webサービスを実行すると、ページの上部に「サービスの説明」というリンクが表示されます。 "。ここをクリックすると、ブラウザにWSDLファイルが表示されます。別の方法として、クエリ文字列の最後に"?wsdl "を追加すると、wsdlファイルが取得されます。

于 2011-12-13T17:08:46.133 に答える