2009-08-13 34 views
1

我有一個運行在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

回答

1

首先,將管理員從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中的情況大致相同,但可以使全局錯誤處理正常工作,並且使調試變得更加簡單。

0

嘗試訪問包含Web服務的文件夾上的IIS_USRS組,然後再次檢查:)。

+0

這不是問題。如果我更改配置以訪問來自其他計算機的數據,系統的每個部分都會獨立工作。只有在兩個實例都在Vista上運行時纔會出現問題。 – Achim 2009-08-16 16:30:56

0

當您收到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

相關問題