次のコードを使用して、単純なファイルを非同期 (Silverlight 4) コンテキストで Web サーバーに書き込みます。
public void WriteToServerAsync(string _input, Uri _uri, Action<bool> _writeComplete)
{
var client = new WebClient();
var bytes = Encoding.UTF8.GetBytes(_input);
var inputStream = new MemoryStream(bytes);
client.OpenWriteCompleted += (s, e) =>
{
var buffer = new byte[4096];
var bytesRead = 0;
while ((bytesRead = inputStream.Read(buffer, 0, buffer.Length)) != 0)
{
e.Result.Write(buffer, 0, bytesRead);
}
e.Result.Close();
};
client.WriteStreamClosed += (s, e) =>
{
_writeComplete(e.Error == null);
};
client.OpenWriteAsync(_uri);
}
私はそれを呼んでいます
public void TestWriteToServer()
{
var uri = new Uri( GetAppSetting( "MLCalculations" ) );
WriteToServerAsync("This is some stuff to write", uri, (b) =>
{
// All done!
});
}
GetAppSetting 呼び出しから返される文字列は次のようになります。
http://servername/MainDirectory/Writeable/TestFile.txt
私が遭遇した問題は、client.WriteStreamClosed イベント ハンドラーにあり、e.Error には「リモート サーバーがエラーを返しました: NotFound.」があります。
Web サーバーには、C:\inetpub\wwwroot\MainDirectory\Writeable というファイル構造があります。MainDirectory フォルダーのセキュリティでは、IIS_IUSRS にはフル コントロールがあり、Writeable フォルダーにもフル コントロールがあると示されていますが、MainDirectory のチェックマークは太字で、Writeable のチェックマークは淡色表示になっています。
「作成」の問題の場合に備えて、「元の」ファイルをターゲットディレクトリに配置しようとしましたが、同じ結果が得られました。
WebClient.OpenReadAsync に問題はありません。私は何が欠けていますか?