一、前言
最近需要將自己寫的WCF服務部署到遠程服務器上,也就是公網上。宿主是IIS,在配置成功之前遇到了很多問題,問題如下:
1. WCF該怎么宿主在IIS上,為何會出現 400 Bad Request
2. 防火牆如何開放
3. 為何我能在客戶端引用服務,但是運行時依然提示Soap操作錯誤,404 Not Found
那么接下來,我就告訴大家我走過的坑,也避免了百度上各種司機瞎帶路。(網上好多其實是本地部署,Localhost誰都會,VS直接Debug都行)
二、准備階段
首先你要配置好的你的web.config,web.config的配置正確與否直接影響你WCF部署的成功與否。這里我可以提供一個我的例子,供大家參考:
1 <?xml version="1.0"?> 2 <configuration> 3 <appSettings/> 4 <connectionStrings/> 5 <system.web> 6 <compilation debug="true" targetFramework="4.0"/> 7 <!-- 8 通過 <authentication> 節,可以配置 9 ASP.NET 用於識別來訪用戶身份的 10 安全驗證模式。 11 --> 12 <authentication mode="Windows"/> 13 <!-- 14 如果在執行請求的過程中出現未處理的錯誤, 15 則可以通過 <customErrors> 節 16 配置相應的處理步驟。具體來說, 17 開發人員可以通過該節配置 18 將取代錯誤堆棧跟蹤顯示的 HTML 錯誤頁。 19 20 <customErrors mode="RemoteOnly" defaultRedirect="GenericErrorPage.htm"> 21 <error statusCode="403" redirect="NoAccess.htm" /> 22 <error statusCode="404" redirect="FileNotFound.htm" /> 23 </customErrors> 24 --> 25 <pages controlRenderingCompatibilityVersion="3.5" clientIDMode="AutoID"/> 26 </system.web> 27 <!-- 28 在 Internet 信息服務 7.0 下運行 ASP.NET AJAX 時 system.webServer 節 29 是必需的。而對於早期版本的 IIS,此節並不是必需的。 30 --> 31 <system.webServer> 32 <!-- 33 若要在調試過程中瀏覽 Web 應用程序根目錄,請將下面的值設置為 True。 34 在部署之前將該值設置為 False 可避免泄露 Web 應用程序文件夾信息。 35 --> 36 <directoryBrowse enabled="true"/> 37 </system.webServer> 38 <system.serviceModel> 39 40 <bindings> 41 <basicHttpBinding> 42 <binding name="bindingConfig" closeTimeout="00:30:00" openTimeout="00:30:00" 43 receiveTimeout="00:30:00" sendTimeout="00:30:00" hostNameComparisonMode="StrongWildcard" 44 maxBufferPoolSize="2147483647" 45 maxReceivedMessageSize="2147483647" 46 maxBufferSize="2147483647" 47 messageEncoding="Text"> 48 <security mode="None"/> 49 </binding> 50 </basicHttpBinding> 51 </bindings> 52 53 54 <services> 55 <service behaviorConfiguration="BiChengUpdateService.Service1Behavior" 56 name="BiChengUpdateService.UpdateService"> 57 <endpoint address="" binding="basicHttpBinding" 58 bindingConfiguration="bindingConfig" name="Endpoint1" contract="BiChengUpdateService.IUpdateService" /> 59 <endpoint address="mex" binding="mexHttpBinding" name="Endpoint2" 60 contract="IMetadataExchange" /> 61 </service> 62 </services> 63 <behaviors> 64 <serviceBehaviors> 65 <behavior name="BiChengUpdateService.Service1Behavior"> 66 <!-- 為避免泄漏元數據信息,請在部署前將以下值設置為 false --> 67 <serviceMetadata httpGetEnabled="true"/> 68 <!-- 要接收故障異常詳細信息以進行調試,請將以下值設置為 true。在部署前設置為 false 以避免泄漏異常信息 --> 69 <serviceDebug includeExceptionDetailInFaults="false"/> 70 <serviceThrottling maxConcurrentCalls="1000" maxConcurrentSessions="1000" maxConcurrentInstances="1000" /> 71 </behavior> 72 </serviceBehaviors> 73 </behaviors> 74 <serviceHostingEnvironment multipleSiteBindingsEnabled="true" /> 75 </system.serviceModel> 76 </configuration>
這里,一定要注意的是兩個地方:
1. Endpoint address
2. MultipleSiteBindingEnabled
問:web.config里有兩個Endpoint address, 一個是mex(這個我們不管),另一個是”空”(這個特別重要),為什么要設成空值呢?
難道部署在遠程服務器上不應該寫的是服務器的IP地址嗎?
答:錯!這個WCF所部署的IP地址和其相應的端口我們交給IIS即可。
問:如果我在Endpoint address寫了服務器的IP地址及端口,例如:114.112.133.23:2037/UpdateserIve.svc會如何?
答:那你就掉坑里了,如果這樣寫,客戶端確實可以引用你的服務,但是在114.112.133.23:2037/UpdateserIve.svc?wsdl(用瀏覽器打開),
看最后一行,你會發現你的Soap Address會是這個尿性:114.112.133.23:2037/UpdateserIve.svc/114.112.133.23:2037/UpdateserIve.svc
這明顯地址有復制了一遍嘛!!!然后客戶端的會出現Soap 操作錯誤,具體的錯誤Message為404 Not Found。
配置好上述config后,我們在遠程服務器硬盤上新建一個文件夾,放置發布服務時需要的文件,一共三個:bin, .svc 以及web.config
bin文件主要放置你在WCF服務中生成的dll,其實你編譯完WCF服務項目后,直接把bin文件拷貝了就行。
三、IIS配置
1. 打開遠程服務器的IIS,找到“處理程序映射”,看看有沒有這個:
沒的話,這個可以百度一下,我就不贅述了,這步沒司機會坑你。
2. 添加一個應用程序池,專門給你部署的WCF服務使用:
托管管道模式為集成!請注意,你的WCF項目編譯時也要一致!
3. 新建網站,配置網站的物理地址:
物理地址就是之前新建的文件夾,應用程序池就是我們之前剛建的應用程序池。這里沒顯示出.svc及web.config,網站右鍵切換到內容視圖即可
4. IIS的配置端口:
IP地址不要寫你的服務器公網地址,會出現400 Bad Request,直接選擇全部未分配!
四、防火牆設置
有百度大神說把防火牆關了,關你大爺,服務器這么重要關什么防火牆。假設你要用7293端口,你只要在防火牆開放這個端口即可。
首先,你的防火牆一定要能允許WCF運行:
其次,新建入站規則,點擊端口,開放出你所需要的WCF端口即可!
五、總結
WCF既要求你會寫代碼,又要你會配置,最后還得要求你會部署。總結下這幾個步驟:
1. 寫好代碼,IServiceT以及ServiceT.svc
2. 配置好你的web.config,這個是核心,建議多看看博園里大神的分析與指導。
3. IIS的配置,應用程序池->處理程序映射->新建網站->物理路徑->IP及端口
4. 防火牆配置,是否允許WCF->新建入站規則,開放指定的WCF端口
5. 遠程服務器WCF配置完后,在你客戶端電腦上去訪問頁面:XXX.XXX.XXX.XX:XX/YYY.svc ,
如果正常:繼續在該Url后添上“?wsdl”,即:
XXX.XXX.XXX.XX:XX/YYY.svc?wsdl,查看網頁最下方的Soap Address是否為XXX.XXX.XXX.XX:XX/YYY.svc
如果是機器名:win2008:XX/YYY.svc,那你肯定第二步沒做好!
如果不正常:第三步就有問題了