ASP.NET应用程序/ Web服务无法在Windows Vista/IIS 7上工作:访问权​​限问题?

问题描述:

我有一个运行在http://localhost/serivce.svc/的基于.NET 3.5的Web服务。然后我有一个运行在http://localhost/myApp的ASP.NET应用程序。在Application_Load我的应用程序从Web服务中读取一些XML配置。在我的机器上工作正常,但:ASP.NET应用程序/ Web服务无法在Windows Vista/IIS 7上工作:访问权​​限问题?

  • 在带有IIS 7的Windows Vista上,对Web服务的请求失败。
  • 可以通过浏览器访问Web服务,而不会出现任何问题。
  • 我将应用程序的应用程序池配置为以管理员身份运行。我将管理员添加到IIS_USRS组,但仍无法访问Web服务。 impersonate=true/false似乎没有区别。
+0

“对webervices的请求失败” - 它如何失败?是否有例外?请张贴它。事件日志中是否有任何内容?发布。 – 2009-08-16 20:31:37

+0

我从web服务返回一个503。我将访问过的URL写入日志文件,并且在浏览器中正常工作。由于代码工作正常,如果从Visual Studio启动,我还无法通过调试器获取更多信息。 – Achim 2009-08-16 20:53:16

+0

我试图进一步调试问题。如果我给myApp配置了一个不存在的错误URL,我仍然会得到一个503.这很奇怪,因为我期望404。我尝试使用Fiddler来查看请求的细节,但是没有请求显示在小提琴手。所以我认为这个请求甚至不会离开myApp。不知何故,本地请求必须禁止在该机器上,但我不知道为什么以及如何检查!? – Achim 2009-09-07 10:23:11

首先,将管理员从IIS_WPG组中取出,然后再忘记,并将应用程序池配置恢复正常。

现在,通过将启用WCF日志记录服务在你的web.config文件中的下列 -

<system.diagnostics> 
    <sources> 
     <source name="System.ServiceModel.MessageLogging" switchValue="Warning, ActivityTracing"> 
      <listeners> 
       <add type="System.Diagnostics.DefaultTraceListener" name="Default"> 
        <filter type="" /> 
       </add> 
       <add name="ServiceModelMessageLoggingListener"> 
        <filter type="" /> 
       </add> 
      </listeners> 
     </source> 
    </sources> 
    <sharedListeners> 
     <add initializeData="c:\logs\web_messages.svclog"* 
      type="System.Diagnostics.XmlWriterTraceListener, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" 
      name="ServiceModelMessageLoggingListener" traceOutputOptions="Timestamp"> 
      <filter type="" /> 
     </add> 
    </sharedListeners> 
</system.diagnostics> 


<system.serviceModel> 
... 
    <diagnostics> 
    <messageLogging logMalformedMessages="true" *logMessagesAtServiceLevel="true"* 
     logMessagesAtTransportLevel="true" /> 
    </diagnostics> 
... 
</system.ServiceModel> 

创建C:\ logs目录,并确保应用程序池标识的用户对具有完全控制该目录。现在测试你的应用。

如果没有创建日志文件,那么在到达WCF服务时会出现问题。 如果正在创建日志文件,请在作为Windows SDK一部分提供的Service Trace查看器中查看它们。您会看到一条红色的消息,它是包含服务内部抛出的异常的日志条目 - 这应该会给您一个指向您的服务代码出错的指针。

如果问题出在你的应用程序中,而不是服务,那么你应该在Application_Load事件中记录异常(无论如何你应该记录异常) - 但是如果你尝试使用全局异常处理程序,那么你的应用程序是在启动失败,所以全局异常处理程序将永远不会开始运行 - 而不是将可能的failable方案放入Application_Load我会将它移出一个实用程序类,它提供了所需信息的访问点(例如myGlobalThingumy.GetStuff() )。让这个班级成为一个单身人士,然后检查你是否已经拥有了这些东西 - 如果你不这样做,那么你就打电话给你的网络服务。它的作用与将它放在Application_Load中的情况大致相同,但可以使全局错误处理正常工作,并且使调试变得更加简单。

尝试访问包含Web服务的文件夹上的IIS_USRS组,然后再次检查:)。

+0

这不是问题。如果我更改配置以访问来自其他计算机的数据,系统的每个部分都会独立工作。只有在两个实例都在Vista上运行时才会出现问题。 – Achim 2009-08-16 16:30:56

当您收到503错误时,是否考虑过查看计算机上的事件查看器以查看IIS是否记录了异常。

从Visual Studio启动时,它是否在Visual Studio Web服务器或IIS中运行? (这是一个关键点,从2005年开始,Visual Studio默认使用了自己的Web服务器用于Web项目,并且该Web服务器在您的用户帐户下执行 - 对于接下来的内容也很重要)。试图从文件中读取一些XML优点。在.NET中,为了读取文件,出于某种原因,执行代码的用户(在IIS7中我认为它是IIS_USERS和NETWORK SERVICE;在旧版本的IIS中,IUSR_MachineName和ASPNET)必须同时具有读取和编写访问权限。所以我要检查的第一件事就是该XML文件上的ACL。确保适当的用户具有读/写访问权限。顺便说一下,这将是NTFS权限 - 右键单击​​资源管理器中的文件,选择安全性并添加适当的权限。

是什么给了它拿走的是,当你从运行Visual Studio中的解决方案,而不是当它从IIS执行的工作。我不相信你从网络服务中获得503--你最有可能从myApp本身得到503。

这样做的原因是503,因为你试图阅读Application_Load此文件。这意味着在任何页面甚至可以尝试提供服务之前,您的XML文件必须被读取和解析。经过反思,再次重新阅读这个问题,我现在99.99%肯定无法读取这个文件(由于缺乏写权限)是问题所在。

我的建议是:拿出所有的你所做的东西管理,把你的用户/ ACL配置恢复正常,是怎么回事 - 包括程序池。然后,按照上面的建议授予适当的IIS用户对XML文件的读/写访问权限。我99.99%肯定你的应用程序现在可以在IIS中工作。

+0

您的解释对我来说听起来很合理,但我认为这有一个误区:XML配置不是从文件系统读取的。它通过HTTP从URL中读取,位于同一台服务器上(http://localhost/serivce.svc/)。我的进程可能不被允许访问该URL,但如何检查? – Achim 2009-09-15 09:38:15

+0

我不确定为什么那会成为我头顶的问题;但是我仍然相当确信你的503s是由于Application_Load引起的。在这一点上,我可能不得不看更多的应用程序......在这一点上,如果你使用WCF,现在是时候开始使用blowdart的建议。 – 2009-09-15 13:58:43