目的: 自動化されたサーバー グループからデータベースに一連のテスト レポートを送信する必要があります。テスト スクリプトは 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に影響しますか?