2010年1月23日 星期六

WCF Service cant HOST in IIS 7.0 Troubleshooting

這幾天突然心血來潮,想要測試一些ASP.NET整合WCF的功能,因此為了方便測試起見,直覺就是把WCF Service放在IIS 7.0 中,讓IIS自動來控管,興高采烈的新增了一個WCF服務的網站

image

然後先進行service的測試,是否可正常運作,因此把Service.svc跑起來,想說應該是很理所當然的執行成功,沒想到突然IE上出現的錯誤訊息,讓我愣了一下。因為之前都是使用File System的方式建立網站,因此當把WCF實際放到IIS 80 port的路徑下時,就錯誤了。

image

當然,以上的錯誤訊息很明顯是IIS中的"處理常式對應"沒有在IIS對應到svc的副檔名,但是亞當斯想了想,當初明明是IIS先裝再裝vs.net的,因此理論上有關.NET的IIS metadata都會自動安裝完成,怎還會對應不到? (目前猜想中可能是因為之前裝了一些.NET測試小工具,影響到IIS的設定,至於是哪一個小工具,目前尚無法確定),打開IIS的"處理常式對應",發現真的是沒有svc的對應。

解決方式為 :

1.在VS.NET的命令提示字元視窗下指令,先安裝對應的WCF metadata:

C:\Windows\Microsoft.NET\Framework\v3.0\Windows Communication Foundation\ServiceModelReg.exe -i

2.在VS.NET的命令提示字元視窗下指令以查詢設定狀況:

ServiceModelReg.exe -vi

image

此時,在machine的web.config就會自動加入副檔名的執行對應(如下),但是IIS中卻還是不會自動加入。

<add path="*.svc" verb="*" type="System.ServiceModel.Activation.HttpHandler, System.ServiceModel, Version=3.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" validate="false" />

3.回到IIS 7.0管理工具,設定IIS的處理常式對應,如下圖:

image

並且新增一個svc對應的處理常式:

  • 要求路徑:*.svc
  • 類型:System.ServiceModel.Activation.HttpHandler, System.ServiceModel, Version=3.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
  • 名稱:svc-Integrated。

image

4.設定好之後,執行IIS網站中,任一個已經設計好.svc的服務,就可以呈現正常的服務頁面了。

image