在網際網路資訊服務 (IIS) 中裝載遠端物件
使用網際網路資訊服務 (IIS) 裝載遠端型別時,因為是由 IIS 和 ASP.NET 建立主應用程式定義域,所以無法以程式設計方式直接在主機處理序中設定可遠端處理型別的遠端處理系統。然而,您可以使用 Global.asax 檔案,以程式設計方式處理多數同樣可在其他類型應用程式定義域中設定的組態。當 IIS 是您的主機處理序時,若要使用組態檔設定遠端處理,則必須執行下列動作:
將組態資訊放在選擇要使用之 IIS 虛擬目錄的 Web.config 檔案中。
將可遠端處理型別實作放在 \bin 目錄 (或使用全域組件快取工具 (Gacutil.exe) 將它放在全域組件快取)。
此外,不可執行下列任何一項動作:
在 IIS 中進行裝載的情況下,指定應用程式名稱。虛擬目錄的名稱會變成您的應用程式名稱。
在設定 .NET 遠端處理的 Web.config 檔案中使用 <debug> 項目。
使用任何非 HttpChannel 的通道。
使用 Web.config 檔案和 <client> 項目,自動設定用戶端 Web 應用程式。如果想要將 IIS 當做遠端處理用戶端使用,則必須在 Global.asax 檔案的 Application_Start 方法中呼叫 RemotingConfiguration.Configure。
遠端處理的組態檔仍會包含系統需要知道的型別基本資訊,但必須稍微變更部分宣告,以配合裝載環境。例如,可自行設定特定 HttpChannel,但不應指定通道的通訊埠;如果 ASP.NET 建立另一個應用程式定義域以處理負載,則遠端處理組態會造成該新的應用程式定義域重新嘗試接聽同一個通訊埠,而引發例外狀況。例如,IIS 裝載之 .NET 遠端 XML Web Service 的簡單 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 接聽該通訊埠。系統會自動使用您所設定的通道來處理該通訊埠上送出的遠端要求。 |
若要順利在 IIS 內裝載伺服器啟動的 (即 <wellknown>) 物件,則必須讓物件統一資源識別元 (URI) 以 .rem 或 .soap 結束 (其他主應用程式定義域則不需要這樣做)。若要使用 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 檔案。
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
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);
}
換言之,其他類型主應用程式定義域中所用的裝載方式,也可同樣用在 IIS 中裝載服務。如需完整範例,請參閱 遠端處理範例:在網際網路資訊服務 (IIS) 中進行裝載。
.NET 遠端處理時使用 SSL 憑證
憑證會識別特定電腦,該電腦的名稱位在憑證的通用名稱中。然而,要變更電腦名稱或是在用戶端組態檔中使用 "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。然後,必須將物件傳遞給 ServicePointManager.CertificatePolicy 屬性,以向 System.Net.ServicePointManager 物件註冊物件。下列程式碼是基本實作。
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 遠端處理中啟用特定類型之驗證行為的組態設定。
需要的行為 | 組態設定 | Comments |
---|---|---|
伺服器使用用戶端的預設認證來驗證每個呼叫上的用戶端。 |
在伺服器的 IIS 中,選取 [整合式 Windows 驗證] 並清除 [匿名存取]。 在用戶端上,將 credentials 設定為使用 CredentialCache.DefaultCredentials。 |
這是 .NET Framework 1.0 版在 useDefaultCredentials 為 true 時的預設行為。 如果 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 (含) 以後版本才支援這個行為。 |