2

目的: 自動化されたサーバー グループからデータベースに一連のテスト レポートを送信する必要があります。テスト スクリプトは Python で作成されており、ワームの缶を開くのではなく、完成したテストを WCF サービスにプッシュする Powershell スクリプトをセットアップしたいと考えています。

レポートを管理する既存の ASP.NET Web サイトがあり、そこから構築するために、オートメーション経由でアクセスできる単純な WCF サービスを追加したいと考えています。しかし、私は壁にぶつかっているようで、これが機能することに非常に近づいているように感じます。私はこの問題に数日間取り組んできましたが、関連するヘルプを見つけようとしてウェブサイトを読んで目が出血し始めています.

サービスコード:

namespace TrendDB.Web
{
    [ServiceContract]
    public interface ITrendRestService
    {
        [OperationContract]
        [WebGet]
        string GetTestMessage();
    }

    [AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
    public class TrendRestService : ITrendRestService
    {
        public string GetTestMessage()
        {
            return "Success!";
        }
    }
}

Web.config (関連情報のみ表示):

<system.web>
...
  <authentication mode="Windows" />
  <authorization>
    <deny users="?" />
  </authorization>
...
</system.web>
...
<system.serviceModel>
  <behaviors>
    <serviceBehaviors>
      <behavior name="">
        <serviceMetadata httpGetEnabled="true" httpsGetEnabled="true" />
        <serviceDebug includeExceptionDetailInFaults="false" />
      </behavior>
    </serviceBehaviors>
    <endpointBehaviors>
      <behavior name="restfulBehavior">
        <webHttp/>
      </behavior>
    </endpointBehaviors>
  </behaviors>
  <serviceHostingEnvironment aspNetCompatibilityEnabled="true" multipleSiteBindingsEnabled="true" />
  <services>
    <service name="TrendDB.Web.TrendRestService">
      <endpoint address="" behaviorConfiguration="restfulBehavior"
                binding="webHttpBinding" bindingConfiguration="" contract="TrendDB.Web.ITrendRestService">
      </endpoint>
    </service>
  </services>
</system.serviceModel>

これが私のブラウザで動作することをテストしたhttp://localhost/trenddb/TrendRestService.svc/GetTestMessageところ、次のメッセージが表示されました。

<string xmlns="http://schemas.microsoft.com/2003/10/Serialization/">Success!</string>

IIS 7.5 は、MS の BKM を使用して、イントラネットのロール認証の MVC を使用するようにセットアップされました。サイトには特定のアプリケーション プールが設定されており、サーバーは Windows 認証を使用してドメインに設定されています。

Powershell への最初の呼び出しは次のように始まりました。

$trend = New-WebServiceProxy -uri http://localhost/trenddb/TrendRestService.svc

New-WebServiceProxy : The request failed with HTTP status 401: Unauthorized.

少なくともそれは匿名アクセスに対する定型の応答であるため、これは良いことです。そのため-UseDefaultCredential、コマンドに追加して次のようにしました。

$trend = New-WebServiceProxy -uri http://localhost/trenddb/TrendRestService.svc -UseDefaultCredential
New-WebServiceProxy : Object reference not set to an instance of an object.

GetTestMessage何が起こったのかを確認するためだけに、WebInvokeを使用してみました。

$trend = New-WebServiceProxy -uri http://localhost/trenddb/TrendRestService.svc/GetTestMessage -UseDefaultCredential
New-WebServiceProxy : The document at the url 
http://localhost/trenddb/TrendRestService.svc/GetTestMessage was not recognized as a known document type.
The error message from each known type may help you fix the problem:
- Report from 'WSDL Document' is 'There is an error in XML document (1, 2).'.
  - <string xmlns='http://schemas.microsoft.com/2003/10/Serialization/'> was not expected.
- Report from 'XML Schema' is 'The root element of a W3C XML Schema should be <schema> and its namespace should be 'http://www.w3.org/2001/XMLSchema'.'.
- Report from 'DISCO Document' is 'Discovery document at the URL http://localhost/trenddb/TrendRestService.svc/GetTestMessage could not be found.'.
  - The document format is not recognized.

WCF へのブラウザー呼び出しから、これ<string xmlns='http://schemas.microsoft.com/2003/10/Serialization/'>がまさに私が期待していたものであることがわかりました...そのため、この WCF REST サービスに接続するために必要な powershell を把握する必要があります。

編集: svcutil.exe ユーティリティを使用すると、プロキシが作成されますが、構成ファイルはスキップされます。この行serviceMetadata httpGetEnabled="true"は、WCF クライアントで使用できるメタデータを生成していることを意味していますか? これはPSに影響しますか?

4

1 に答える 1

9

New-WebServiceProxy は、 Web サービス(.NET の .asmx など)への "Web サービス" プロキシを作成します。これらの種類のサービスは、WS-I-Basic Profile 1.1 サービスです。つまり、WSDL への期待があります。

WCF サービスには、 WebHttpBindingエンドポイントである 1 つのエンドポイントしかありません。この種のエンドポイントは HTTP クライアント (非 SOAP) に使用され、REST クライアントは Web のプロトコル (HTTP および GET、POST などの適切な動詞) のみを使用するため、通常は REST クライアントによって使用されます。ブラウザーを使用してこれをテストしたところ、ブラウザーは単なる HTTP クライアントであるため、機能しました。New-WebServiceProxy のプロキシを使用してテストしたところ、New-WebServiceProxy が作成する種類のクライアントであるため、応答を単なる文字列ではなく WSDL として解釈しようとしています。

WCF サービスWeb サービスクライアント (New-WebServiceProxy など) で機能させるには、それらのクライアントが理解できるバインディング (basicHttpBinding) を使用して、それらのクライアントに別のエンドポイントを追加する必要があります。

      <endpoint address="basic" binding="basicHttpBinding" contract="TrendDB.Web.ITrendRestService" />

これにより、少なくとも 2 種類のクライアント (セキュリティを除く) で動作するようになります。

セキュリティのために、basicHttpBinding 用の BindingConfiguration と webHttpBinding 用の BindingConfiguration を作成します。そこで、クライアント資格情報の種類を Windows に指定できます。

于 2013-08-14T22:47:16.407 に答える