MessageContractを使用せずにファイルをアップロードできるWCFサービスがあります。
[OperationContract, WebInvoke(UriTemplate = "UploadFile?filename={filename}")]
bool UploadFile(string filename, Stream fileContents);
StreamオブジェクトはUriTemplateの一部であるため、Streamオブジェクトの横にある別のパラメーターを使用できます。サービスはマネージドWindowsサービスとして実行されるため、ServiceHostを手動で開始する必要があります。
protected override void OnStart(string[] args)
{
FileServiceHost = new ServiceHost(typeof(FileService), new Uri("http://" + Environment.MachineName + ":8000/FileService"));
FileServiceHost.AddServiceEndpoint(typeof(IFile), new WebHttpBinding(), "").Behaviors.Add(new WebHttpBehavior());
FileServiceHost.Open();
}
これらすべてで、サービスが起動し、正常に機能します。ただし、上記の一部をapp.configファイルに移動したかったのです。これを行うために、の2行目をコメントアウトし、OnStart
1行目を。に置き換えましたFileServiceHost = new ServiceHost(typeof(FileService))
。次に、その情報をapp.configに追加しました...
<system.serviceModel>
<services>
<service name="Test.Server.FileService" behaviorConfiguration="DefaultBehavior">
<host>
<baseAddresses>
<add baseAddress="net.tcp://localhost:8000/FileService"/>
</baseAddresses>
</host>
<endpoint address="" binding="webHttpBinding" contract="IFile"/>
<endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/>
</service>
</services>
<behaviors>
<serviceBehaviors>
<behavior name="DefaultBehavior">
<serviceMetadata httpGetEnabled="true"/>
<serviceDebug includeExceptionDetailInFaults="true"/>
</behavior>
</serviceBehaviors>
</behaviors>
そして突然、サービスが起動できなくなります。FileServiceHost.Open
メソッドの次の例外をスローしますOnStart
。「オペレーションUploadFileのリクエストをストリームにするには、オペレーションにStreamというタイプの単一のパラメーターが必要です。」
app.configでサービスを定義する方法に何か問題があるはずです。そこからサービスを削除すると、すべてが正常に機能するからです。私はここで何が間違っているのですか?