Asp.net mvc 使用HTTP将ASMX webservice转换为使用netTcpBinding的WCF webservice是使用HttpContext的替代方法

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

我一直在研究WCF,并根据我发现的“最佳实践”慢慢地重构我的ASMX webservice解决方案(多个项目),我遇到了一些设计/架构问题,我觉得非常需要停下来寻求建议

摘要:如何在不使用ASP.Net MVC和“路由”的WCF服务中使用HttpContext

详细信息: 更好的性能是本次重写的主要目标,我已经了解到,NetTcpBinding最适合于此,因此我认为我需要避免

[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。
就在下面:

“这些限制仅适用于IIS应用程序中承载的WCF服务。ASP.NET内容的行为不受WCF的影响。 需要由HTTP管道传统提供的功能的WCF应用程序应该考虑使用WCF等价物,它们是主机和传输无关的:

OperationContext而不是HttpContext

最后,我添加了这个名称空间:

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。