0

次のコードを使用して、単純なファイルを非同期 (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 に問題はありません。私は何が欠けていますか?

4

1 に答える 1

0

フォルダーのアクセス許可の灰色のチェックは、それらのアクセス許可が親フォルダーから継承されていることを意味します。

10 回中 9 回、悪名高い「Not Found」エラーはサーバー側の例外によって引き起こされます。IIS ログを確認すると、ステータス コード 500 (サーバー エラー) のエントリを突き止めることができるでしょう。

Web サービスをデバッグできますか? そうでない場合は、編集して追加のトレースを提供できますか。このエラーは、ほぼ確実にサービス自体の例外が原因であるため、サーバー側でエラーを追跡すれば問題は解決します。

わからない場合は、Web サービスのコードを投稿できますか?

于 2013-01-30T20:16:18.767 に答える