2009-07-11 16 views
1

メッセージを受け入れて保存する単純なWCFサービスを作成しました。ローカルにホストされている場合はうまく動作します。私はまだIIS 6でホストされているときに動作します。しかし、xmlにメッセージを格納するサービスの機能を有効にすると、次のエラーが発生します。c:\ windows \ system32 \ inetsrv \ Onno.xmlへのアクセスが拒否されました実際の英語のエラーメッセージと一致しない可能性があります)。 上記のディレクトリからサービスが実行されないため、これは興味があります。さらに、onno.xmlファイルは存在しません。サービスは IIS6でホストされているWCFサービスの既定のディレクトリ?

xelement.Save("onno.xml"); 

File.Exists("onno.xml")==false 

は何が問題である

として、それを作成する必要がありますか?

  • IISでホストされているWCFサービス内のファイルIO操作の既定のディレクトリを指定する必要がありますか。
  • 権限を調整する必要はありますか?

編集: 私は、このようにMapPathの機能を備えたMehrdadのソリューションを実装してみました:

public void Persist(Message message) 
    { 
     foreach (var recipient in message.Recipients)//recipient is a string 
     { 
      XElement xml_messages; 
      string path; 
      try 
      { 
       path = HttpContext.Current.Server.MapPath("~/"+recipient+FileExtension); 
       //FileExtension=".xml" 
       //Null reference exception thrown from this line 
      } 
      catch (Exception e) 
      { 
       throw new Exception("Trying to get path " + e.Message); 
      } 
      try 
      { 
       xml_messages = XElement.Load(path); 
      } 
      catch 
      { 
       xml_messages = XElement.Parse("<nothing/>"); 
      } 
      var element = (XElement) message; 
      if (xml_messages.IsEmpty) 
      { 
       xml_messages = 
        new XElement("messages", 
           new XAttribute("recipient", recipient), 
           element 
         ); 
      } 
      else 
      { 
       xml_messages.Add(element); 
      } 
      xml_messages.Save(path); 
     } 
    } 

私はnull参照例外で迎えていますが?例外はMapPath行で生成されます。助けて?

答えて

5

はい。ファイルの絶対パスを指定する必要があります。

System.Web.HttpContext.Current.Server.MapPath("~/onno.xml") 

を使用すると、アプリケーションディレクトリに書き込む場合は、ファイルの完全なパスを取得できます。

ASP.NET compatibility modeで実行されていないWCFサービスでは、HttpContext.Currentは利用できません。

<serviceHostingEnvironment aspNetCompatibilityEnabled="true" /> 

構成オプションと[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Required)]属性でASP.NET互換モードを有効にすることができます。ただし、これにより、WCFサービスがASP.NET環境に制限されます。これは良いことではありません。

代わりに、あなたは基本パスの設定を使用して完全なパスを取得するために

System.IO.Path.Combine(defaultPath, "onno.xml") 

使用することができます。このソリューションはより柔軟です。

また、その場所へのNTFS書き込みアクセス許可は、アプリケーションプールが実行されているユーザーアカウントに付与する必要があります。

関連する問題