2008/09/26

WCF WebService how to use Server.MapPath function. 如何在WCF WebService裡使用Server.MapPath

為何預設的WCF WebService沒有enable ASP.NET相容模式呢?
因為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了....

參考資料:


象印不鏽鋼真空保溫瓶(SF-CC20)

軟體工程的重要的指標