在網際網路資訊服務 (IIS) 中裝載遠端物件
本主題專門說明一項為了在現有應用程式中提供回溯相容性而保留的舊有技術,不建議用於新的開發工作。分散式應用程式應使用 Windows Communication Foundation (WCF) 進行開發。
若要在網際網路資訊服務 (IIS) 中裝載遠端物件,您必須設定遠端物件。一般來說,您可以透過組態檔,或以程式設計方式在裝載應用程式程式碼中進行設定。如果遠端物件是裝載在 IIS 中,您可以將組態資訊置於 Web.config 檔中,或是以程式設計方式設定 Global.asax 檔案中 Application_Start 方法的遠端物件。
若要使用組態檔來設定遠端物件,請執行下列步驟:
將您的組態資訊放置到選擇使用的 IIS 虛擬目錄內的 Web.config 檔案中。
將可遠端處理的型別實作放置到 \bin 目錄 (或者使用全域組件快取工具 (Gacutil.exe) 將其放置到全域組件快取中)。
指定 Web.config 檔案時,不支援下列項目:
如果指定應用程式名稱,則虛擬目錄名稱將成為您的應用程式名稱。
使用 Web.config 檔案中用來設定 .NET 遠端組態的 <debug> 項目。
使用 HttpChannel 以外的任何通道。
使用 Web.config 檔以及 <client> 項目來自動設定您的用戶端 Web 應用程式。如果您希望將 IIS 當成遠端用戶端來使用,必須呼叫 RemotingConfiguration.Configure (位於 Global.asax 檔案的 Application_Start 方法內)。
Web.config 檔案仍舊包含系統必須知道的型別基本資訊,但是有些宣告必須稍加改變以適應裝載的環境。例如,您可以自訂特定的 HttpChannel,但是您不應該指定通道的連接埠;如果 ASP.NET 建立了另一個應用程式定義域來處理負載,遠端基礎結構會造成新的應用程式定義域嘗試於相同的連接埠上再次接聽,進而引發例外狀況。例如,IIS 裝載的 .NET 遠端物件所屬的 Web.config 檔案可能如下列程式碼範例所示。在此情況下,您不需要納入通道組態程式碼,只需要設定通道屬性即可 (在此情況下,為 priority
屬性)。
<configuration>
<system.runtime.remoting>
<application>
<service>
<wellknown
mode="Singleton"
type="ServiceClass, ServiceClassAssemblyName"
objectUri="ServiceClass.rem"
/>
</service>
<channels>
<channel
name="MyChannel"
priority="100"
ref="http"
/>
</channels>
</application>
</system.runtime.remoting>
</configuration>
注意: |
---|
請勿針對此處所列的任何通道指定連接埠。如果您希望應用程式接聽特定連接埠,請使用網際網路服務管理員來指定讓 IIS 接聽該連接埠。您設定的通道會自動用來處理由該連接埠所送出的遠端要求。 |
若要成功地將伺服器啟動 (亦即<wellknown>) 物件裝載到 IIS 中,您必須擁有以 .rem 或 .soap 為結尾的統一資源識別元 (URI)。其他主機應用程式定義域則無此類要求。若要使用 Soapsuds 工具 (Soapsuds.exe) 來針對 IIS 所裝載的伺服器啟動物件產生中繼資料,用來做為引數傳遞至 Soapsuds.exe 的 URL 需如下所示:
http://< Computer >:< Port >/< VirtDir >/< ObjectURI >?wsdl
如果是 IIS 或其他任何應用程式定義域所裝載的用戶端啟動物件,則您不需要任何格式的物件 URI。當成引數傳遞給 Soapsuds.exe 的 URL 應如下所示:
http://< Computer >:< Port >/< VirtDir >/RemoteApplicationMetadata.rem?wsdl
IIS 中的程式設計組態將透過 Global.asax 頁面來完成。下列範例顯示了與先前顯示之組態檔相同的組態,但是使用 Global.asax 檔案。
<%@ Application Language="VB" %>
<%@ Assembly Name="Server" %>
<%@ Import Namespace="System.Runtime.Remoting" %>
<%@ Import Namespace="System.Runtime.Remoting.Channels" %>
<%@ Import Namespace="System.Runtime.Remoting.Channels.Http" %>
<%@ Import Namespace="Server" %>
Sub Application_Start()
Dim props = New Hashtable() As IDictionary
props("name") = "MyChannel"
props("priority") = "100"
' Nothing entries specify the default formatters.
Dim channel As New HttpChannel( _
props, _
Nothing, _
Nothing _
)
ChannelServices.RegisterChannel(channel)
Dim WKSTE As New WellKnownServiceTypeEntry( _
GetType(ServiceClass), _
"HttpService", _
WellKnownObjectMode.SingleCall
)
RemotingConfiguration.RegisterWellKnownServiceType(WKSTE)
End Sub
<%@ Application Language="C#" %>
<%@ Assembly Name="Server" %>
<%@ Import Namespace="System.Runtime.Remoting" %>
<%@ Import Namespace="System.Runtime.Remoting.Channels" %>
<%@ Import Namespace="System.Runtime.Remoting.Channels.Http" %>
<%@ Import Namespace="Server" %>
void Application_Start(){
IDictionary props = new Hashtable();
props["name"] = "MyChannel";
props["priority"] = "100";
// Null entries specify the default formatters.
HttpChannel channel = new HttpChannel(
props,
null,
null
);
ChannelServices.RegisterChannel(channel);
WellKnownServiceTypeEntry WKSTE = new WellKnownServiceTypeEntry(
typeof(ServiceClass),
"HttpService",
WellKnownObjectMode.SingleCall
);
RemotingConfiguration.RegisterWellKnownServiceType(WKSTE);
}
下列項目必須放置在 Web.config 檔案中,以確保參考必要的組件:
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<system.web>
<compilation>
<assemblies>
<add assembly="System.Runtime.Remoting, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
</assemblies>
</compilation>
</system.web>
</configuration>
如需完整範例,請參閱遠端處理範例:在網際網路資訊服務 (IIS) 中裝載。
使用 SSL 憑證搭配 .NET 遠端處理
憑證可識別特定電腦 (電腦名稱會駐留在憑證的通用名稱中)。然而,您很容易就可以改變電腦名稱,或是使用用戶端組態檔中的 "localhost",如此一來用戶端與伺服器憑證中的通用名稱就會不相符。在 .NET Framework 1.0 版中,會忽略此不相符現象並在伺服器上叫用呼叫。
從 .NET Framework 1.1 版開始,這種不相符情況會擲回下列例外狀況:「System.Net.WebException: 基礎連接已關閉: 無法與遠端伺服器建立信任關係」。如果您無法設定遠端用戶端使用憑證通用名稱,可以在您的用戶端應用程式組態檔中使用下列設定來覆寫此不符情況:
<system.net>
<settings>
<servicePointManager
checkCertificateName="true"
/>
</settings>
</system.net>
若要透過程式設計方式讓您的用戶端忽略憑證名稱的不相符情況,用戶端必須建立可實作 ICertificatePolicy 介面的類別執行個體,然後實作 CheckValidationResult 以便當 certificateProblem 值為 0x800c010f 時,傳回 true。接著您必須將物件註冊到 System.Net.ServicePointManager 物件上,方法是將物件傳遞至 ServicePointManager.CertificatePolicy 屬性中。基本實作如下列程式碼所示:
Public Class MyPolicy Implements ICertificatePolicy
Public Function CheckValidationResult(srvPoint As ServicePoint, certificate As X509Certificate, request As WebRequest, certificateProblem As Integer) As Boolean
' Check for policy common name mismatch.
If certificateProblem = 0 Or certificateProblem = &H800b010f Then
Return True
Else
Return False
EndIf
End Function
End Class
public class MyPolicy : ICertificatePolicy {
public bool CheckValidationResult(ServicePoint srvPoint, X509Certificate certificate, WebRequest request, int certificateProblem) {
// Check for policy common name mismatch.
if (certificateProblem == 0 || certificateProblem == 0x800b010f)
return true;
else
return false;
}
}
下列程式碼會將先前類別的執行個體註冊到 System.Net ServicePointManager:
System.Net.ServicePointManager.CertificatePolicy = New MyPolicy()
System.Net.ServicePointManager.CertificatePolicy = new MyPolicy();
IIS 裝載之遠端應用程式的驗證
下表說明當裝載服務到網際網路資訊服務 (IIS) 時,會啟用 .NET 遠端處理中特定驗證行為型別的組態設定。
所需行為 | 組態設定 | 註解 |
---|---|---|
伺服器使用用戶端預設認證來驗證用戶端的每一次呼叫。 |
在伺服器的 IIS 中,選取 [整合式 Windows 驗證],並清除 [匿名存取]。 在用戶端上,將 useDefaultCredentials 設為 true。 |
當 useDefaultCredentials 為 true 時,這是 .NET Framework 1.0 版的預設行為。 當 useAuthenticatedConnectionSharing 同時設為 false 時,.NET Framework 1.1 版支援此行為。 |
伺服器使用用戶端預設認證來驗證用戶端一次;後續來自此用戶端的呼叫會使用先前驗證的連線。 |
在伺服器的 IIS 中,選取 [整合式 Windows 驗證],並清除 [匿名存取]。 在用戶端上,將 useDefaultCredentials 設為 true。 |
只有 .NET Framework 1.1 (含) 以後版本支援此行為。 |
伺服器使用自訂或明確的用戶端認證來驗證用戶端一次;後續來自此用戶端的呼叫會使用先前驗證的連線。 |
在伺服器的 IIS 中,選取 [整合式 Windows 驗證],並清除 [匿名存取]。 在用戶端上,將 credentials 設為 ICredentials 實作,或將 username, password,與 domain 設為明確的值。在兩種情況中,您都必須同時將 unsafeAuthenticatedConnectionSharing 設為 true 並提供一個僅對應至單一驗證使用者的 connectionGroupName 值。 |
只有 .NET Framework 1.1 (含) 以後版本支援此行為。 |