2011-11-03 48 views
1

我一直在研究WCF並根據我找到的「最佳實踐」緩慢地重構我的ASMX webservice解決方案(多個項目)遇到一些設計/架構問題,我覺得非常需要暫停和尋求建議。使用HTTP轉換ASMX webservice到WCF webservice使用netTcpBinding意味着替代使用HttpContext

摘要:如何在不使用ASP.Net MVC和「路由」的WCF服務中使用HttpContext?

詳情: 更好的性能是該重新寫一個主要目標,我讀過NetTcpBinding的是最好的那個,所以我想我需要避免

[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Required)] 

,需要避免

serviceHostingEnvironment aspNetCompatibilityEnabled="true" 

因此,重構了WCF web服務需要避免ASP.NET相關性,如HttpContext的,會話等我完全不只有一個的WebMethod(UploadFile)目前使用HttpContext的在這些片段使用Session:

[WebMethod(Description = "Upload a file with metadata properties packed in a delimited string")] 
    public string UploadFile(string trimURL 
       , byte[] incomingArray 
       , string fileName 
       , string RecordTypeName 
       , string metaDataString) 
    { 
    string pathFileInfo; // declared here in a "bare block" so it is in scope for the finally block too 
     try 
     { 
      pathFileInfo = ByteArrayToFile(fileName, incomingArray); 
      FileInfo fi = new FileInfo(pathFileInfo); 
      if (fi.Exists) 
      { 

和這裏是HttpContext的使用:http://msdn.microsoft.com/en-us/library/aa702682.aspx

 public string ByteArrayToFile(string _FileName, byte[] _ByteArray) 
    { 
     string fullName = HttpContext.Current.Server.MapPath(@".\UploadWorkArea\") + _FileName; 
     using (FileStream _FileStream = new FileStream(fullName 
        , FileMode.Create 
        , FileAccess.Write)) 
     { 
      _FileStream.Write(_ByteArray, 0, _ByteArray.Length); 
      _FileStream.Close(); 
      return fullName; 
     } 
    } 

因此,我在這裏發現了這個建議

在AppDomain中,由HTTP運行時實現的功能適用於ASP.NET內容,但不適用於WCF。 ASP.NET應用程序平臺的許多HTTP專用功能不適用於包含ASP.NET內容的AppDomain內託管的WCF服務。這些功能的例子包括:

  • 的HttpContext:從WCF服務中進行訪問時,電流總是空。 改爲使用RequestContext。

,並略低於:。

這些限制只適用於託管在IIS應用程序ASP.NET內容的行爲不受WCF存在 WCF應用WCF服務,需要通過傳統的HTTP管道提供的功能,應考慮使用WCF等價物,它們是獨立的主機和運輸:

的OperationContext,而不是高程tpContext「。

最後,我加入了這個命名空間:

using System.Web.Routing; 

..爲了解決這個問題本:

public RequestContext(
HttpContextBase httpContext, 
RouteData routeData 

而且我在那裏我感覺約在繼續進一步非常不確定的點到了。我讀了一點關於ASP.NET MVC和它的使用「路由」但我不是真的在那裏 - 我只是想重建這個,所以它可以使用更快的綁定性能。

希望我的問題很明確,並且我沒有爲你過多地提供一些建議。

回答

1

指第二個答案在How to get working path of a wcf application?

string mappedPath = string.Format(@"{0}\UploadWorkArea\", System.Web.Hosting.HostingEnvironment.ApplicationPhysicalPath); 

我錯過了什麼或者是你所需要的?

+0

謝謝!當我在你提供的鏈接上閱讀「第二個答案」時,沒有要求在ASPNetCompatibility模式下運行WCF webservice,所以我會盡力而且會讓我更接近NetTcpBinding。 –

1

我試過HostingEnvironment.MapPath(),但是引發了一個異常 - 你可能仍然試着看看它是否在你的配置下工作。我還在ILSpy中檢查了HttpServerUtility.MapPath(),發現它調用了HttpRequest.MapPath(),但我不知道在WCF方法中是否有可能獲得HttpRequest實例。

如果一切都失敗了,你可以嘗試使用HostingEnvironment.ApplicationPhysicalPath屬性。我嘗試了下面的代碼,它在ASP.NET MVC應用程序中調用時返回與Server.MapPath()相同的路徑。

Path.GetFullPath(Path.Combine(HostingEnvironment.ApplicationPhysicalPath, @".\UploadWorkArea\", _FileName)); 

this question關於使用Path.GetFullPath