Asp.net mvc 使用HTTP将ASMX webservice转换为使用netTcpBinding的WCF webservice是使用HttpContext的替代方法
我一直在研究WCF,并根据我发现的“最佳实践”慢慢地重构我的ASMX webservice解决方案(多个项目),我遇到了一些设计/架构问题,我觉得非常需要停下来寻求建议 摘要:如何在不使用ASP.Net MVC和“路由”的WCF服务中使用HttpContext 详细信息: 更好的性能是本次重写的主要目标,我已经了解到,NetTcpBinding最适合于此,因此我认为我需要避免:Asp.net mvc 使用HTTP将ASMX webservice转换为使用netTcpBinding的WCF webservice是使用HttpContext的替代方法,asp.net-mvc,wcf,httpcontext,nettcpbinding,requestcontext,Asp.net Mvc,Wcf,Httpcontext,Nettcpbinding,Requestcontext,我一直在研究WCF,并根据我发现的“最佳实践”慢慢地重构我的ASMX webservice解决方案(多个项目),我遇到了一些设计/架构问题,我觉得非常需要停下来寻求建议 摘要:如何在不使用ASP.Net MVC和“路由”的WCF服务中使用HttpContext 详细信息: 更好的性能是本次重写的主要目标,我已经了解到,NetTcpBinding最适合于此,因此我认为我需要避免: [AspNetCompatibilityRequirements(RequirementsMode = AspNetC
[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Required)]
serviceHostingEnvironment aspNetCompatibilityEnabled="true"
需要避免:
[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Required)]
serviceHostingEnvironment aspNetCompatibilityEnabled="true"
因此,为WCF重构的webservice需要避免ASP.NET依赖项,如HttpContext、Session等。我根本不使用Session,但有一个webmethod(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;
}
}
因此,我在这里找到了以下建议:
“在AppDomain中,HTTP运行时实现的功能适用于ASP.NET内容,但不适用于WCF。ASP.NET应用程序平台的许多HTTP特定功能不适用于承载在包含ASP.NET内容的AppDomain内的WCF服务。这些功能的示例包括:
- HttpContext:从WCF服务中访问时,Current始终为空。请改用RequestContext。
using System.Web.Routing;
…为了解决此问题,请执行以下操作:
public RequestContext(
HttpContextBase httpContext,
RouteData routeData
)
我已经到了这样一个地步,我对继续下去感到非常不确定。我读了一点关于ASP.NET MVC及其使用“路由”的内容,但我并没有真正做到这一点——我只是在考虑重建它,以便它可以使用更快的绑定来提高性能
希望我的问题很清楚,我没有过多的闲话让你给我一些建议。我试过了,但那引发了一个异常-你可能仍然可以尝试它,看看它是否在你的配置下工作。我还检查了ILSpy中的HttpServerUtility.MapPath()
,发现它调用了HttpRequest.MapPath()
,但我不知道是否有可能在您的WCF方法中获得一个HttpRequest
实例
如果所有其他操作都失败,您可以尝试使用该属性。我尝试了下面的代码,它在ASP.NET MVC应用程序中调用时返回的路径与Server.MapPath()
相同
Path.GetFullPath(Path.Combine(HostingEnvironment.ApplicationPhysicalPath, @".\UploadWorkArea\", _FileName));
有关路径的使用,请参阅。GetFullPath请参阅 我错过了什么,或者这就是您所需要的吗?谢谢!当我在您提供的链接上阅读“第二个答案”时,没有要求在ASPNetCompatibility模式下运行WCF Web服务,因此我将尝试,这可能会使我更接近NetCpBinding。