我一直在研究 WCF 并根据我发现的“最佳实践”慢慢重构我的 ASMX Web 服务解决方案(多个项目),我遇到了一些设计/架构问题,我觉得非常需要暂停并寻求建议.
摘要:如何在不使用 ASP.Net MVC 和“路由”的 WCF 服务中使用 HttpContext?
详细信息: 更好的性能是这次重写的主要目标,我读过NetTcpBinding最适合这个,所以我认为我需要避免:
[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Required)]
并且需要避免:
serviceHostingEnvironment aspNetCompatibilityEnabled="true"
因此,为 WCF 重构的 web 服务需要避免 ASP.NET 依赖项,例如 HttpContext、Session 等。我根本不使用 Session,但一种 web 方法(UploadFile)目前使用HttpContext,如以下代码片段所示:
[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 的地方:
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;
}
}
因此,我在这里找到了这个建议: http: //msdn.microsoft.com/en-us/library/aa702682.aspx:
"在 AppDomain 中,由 HTTP 运行时实现的功能适用于 ASP.NET 内容,但不适用于 WCF。ASP.NET 应用程序平台的许多 HTTP 特定功能不适用于托管在包含 ASP.NET 的 AppDomain 内的 WCF 服务内容。这些功能的示例包括:
- HttpContext:当从 WCF 服务中访问时,Current 始终为 null。请改用 RequestContext。
并在此之下:
"这些限制仅适用于托管在 IIS 应用程序中的 WCF 服务。ASP.NET 内容的行为不受 WCF 存在的影响。需要传统上由 HTTP 管道提供的功能的 WCF 应用程序应考虑使用 WCF 等效项,它们是宿主和运输独立:
OperationContext而不是HttpContext。”
最后,我添加了这个命名空间:
using System.Web.Routing;
..为了解决这个问题:
public RequestContext(
HttpContextBase httpContext,
RouteData routeData
)
我已经到了我对继续前进感到非常不确定的地步。我已经阅读了一些关于ASP.NET MVC的内容,它使用了“路由”,但我并不真正在那里——我只是在考虑重建它,以便它可以使用更快的绑定来提高性能。
希望我的问题很清楚,我并没有过多地让你给我一些建议。