【WCF】如何將WCF部署到遠程服務器


一、前言

      最近需要將自己寫的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,那你肯定第二步沒做好!

    如果不正常第三步就有問題了


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM