一、前言 最近需要將自己寫的WCF服務部署到遠程伺服器上,也就是公網上。宿主是IIS,在配置成功之前遇到了很多問題,問題如下: 1. WCF該怎麼宿主在IIS上,為何會出現 400 Bad Request 2. 防火牆如何開放 3. 為何我能在客戶端引用服務,但是運行時依然提示Soap操作錯誤,40 ...
一、前言
最近需要將自己寫的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,那你肯定第二步沒做好!
如果不正常:第三步就有問題了