1

テキスト ファイルをパラメーターとして受け取り、そのファイルの内容を返す Web サービスを作成したいと考えています。

この Web サービスは、C# クライアントによって使用されます。

これは私がこれまでに持っているものです(Webサービス):

[WebMethod]    
public String txtFile(String filename)
{
   StreamReader sr = File.OpenText(filename);   
   {
      String line = sr.ReadToEnd();
      return line;            
   } 
}

および (クライアント):

WebService ws = new WebService();
ws.txtFile("textfile.txt");

クライアントを実行すると、UnauthorizedAccessException が発生します。

4

5 に答える 5

2

そのため、問題は、現在の IIS ユーザーがファイルにアクセスする権限を持っていない (読み取ることさえできない) ことでした。

そして明らかに、Web サービスは現在の (Windows) ユーザーではなく、アプリケーション プール ID を使用します (アプリケーションに対して Windows 認証を有効にしている場合を除く)。

次の手順に従って、アプリケーション プールのアクセス許可を追加します。

  1. Windows エクスプローラーを開く
  2. ファイルまたはディレクトリを選択
  3. ファイルを右クリックし、「プロパティ」を選択します
  4. 「セキュリティ」タブを選択
  5. 「編集」をクリックし、「追加」ボタンをクリックします
  6. [場所] ボタンをクリックし、マシンを選択していることを確認します
  7. [選択するオブジェクト名を入力してください:] テキスト ボックスに「IIS AppPool\DefaultAppPool」と入力します。
  8. 「名前の確認」ボタンをクリックし、「OK」をクリックします。
于 2013-04-23T17:39:26.297 に答える
1

IIS で Web サービスを実行している場合、Web サービスは魔法のようにユーザーとして実行されません。アプリケーションに対して Windows 認証が有効になっていない限り、Web サービスはアプリケーション プール ID を使用してファイルにアクセスし、その ID にはファイルへのアクセス許可が必要です。

于 2013-04-23T17:44:09.490 に答える
1

Web サービスにログを追加し、ログ フレームワークに入力パラメーターと例外の詳細をダンプします (はい、Web サービスに try-catch を追加する必要があります)。

これを行う前に:

StreamReader sr = File.OpenText(filename);

も確認してください:

if(!File.Exists(filename))
{
  // dump to the log file the file was not found at the location... filename
  return string.empty;
}

次に、次のことができます。

using(var sr = File.OpenText(filename))
{
  string line = sr.ReadToEnd();
  return line;
}

最後に、クライアントからサーバーに相対パスを渡しても意味がないことに注意してください。ネットワーク パス、C または D ドライブ、または呼び出しでローカルにマップされたその他のドライブ/パスのみを指定できることを確認する必要があります。クライアントにアクセスできないか、Web サーバー上の別のものにアクセスしている可能性があります。

于 2013-04-23T17:07:39.067 に答える
0

File.OpenText多くの異なる例外をスローできます: http://msdn.microsoft.com/en-us/library/system.io.file.opentext.aspx (パスが正しい形式であることを確認することから始めます)

StreamReader.ReadToEndOutOfMemoryExceptionまたはIOExceptionをスローできます。ここのリファレンスを参照してください: http://msdn.microsoft.com/en-us/library/system.io.streamreader.readtoend.aspx

于 2013-04-23T17:07:09.297 に答える