因為WCF是微軟新推出的分散式架構解決方案,有些client端的應用程式並不一定是web,
所以也就沒有必要先把ASP.NET相容模式打開,保留了一些彈性。
若開啟ASP.NET相容模式後:
- WCF 行為就會在下列 ASP.NET 功能上與 ASMX 行為一致:
- 在 ASP.NET 相容性模式中執行的 HttpContext: WCF 服務可以存取 Current 與其關聯狀態。
- 檔案架構授權:在 ASP.NET 相容性模式中執行的 WCF 服務可以將檔案系統存取控制清單 (ACL) 附加至服務的 .svc 檔中,以保護自身的安全。
- 可設定的 URL 授權:在 ASP.NET 相容性模式中執行 WCF 服務時,會強制執行 WCF 要求的 ASP.NET 的 URL 授權規則。
- HttpModuleCollection 擴充性:由於在 ASP.NET 相容性模式中執行的 WCF 服務會充分參與 ASP.NET HTTP 要求的生命週期,任何透過 HTTP 管線設定的 HTTP 模組都能夠在叫用服務前/後在 WCF 要求上運作。
- ASP.NET 模擬:如果已經針對應用程式啟用了 ASP.NET 模擬,則透過 ASP.NET 模擬執行緒目前的身分識別來執行的 WCF 服務可能會與 IIS 處理序身分識別不同。 如果同時針對特定的服務作業啟用了 ASP.NET 模擬與 WCF 模擬,則服務實作最終將會透過從 WCF 取得的身分識別來執行。
- Server.MapPath無法使用是因為在WCF Server端中,HttpContext.Current會是null,所以無法使用。
設定步驟如下:
1. 開啟aspNetCompatibilityEnabled=true
在web.config裡會看到下面這段:
<serviceHostingEnvironment aspNetCompatibilityEnabled="true" />
2. 在Implemente的class加入AspNetCompatibilityRequirements
ITestService.cs :
using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Serialization;
using System.ServiceModel;
using System.Text;
[ServiceContract]
public interface ITestService
{
[OperationContract]
void DoWork();
[OperationContract]
string GetLogFilePath();
}
TestService.cs :
using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Serialization;
using System.ServiceModel;
using System.Text;
using System.ServiceModel.Activation;
using System.Web;
[ServiceBehavior]
[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
public class TestService : ITestService
{
public void DoWork()
{
}
public string GetLogFilePath()
{
string logFile = "~/res/iislog/100/ex07021023.log.gz";
return HttpContext.Current.Server.MapPath(logFile);
}
}
這樣在client就不會有exception了....
參考資料: