使用HTTP将ASMX webservice转换为WCF webservice使用netTcpBinding意味着使用HttpContext的替代方法

时间:2011-11-03 23:34:37

标签: asp.net-mvc wcf httpcontext nettcpbinding requestcontext

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

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

详情: 更好的性能是这次重写的主要目标,我已经读到 NetTcpBinding 是最好的,所以我认为我需要 避免

[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Required)]

需要 避免

serviceHostingEnvironment aspNetCompatibilityEnabled="true"

因此,为WCF重构的Web服务需要避免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;
        }
    }

因此,我在这里找到了这个建议:http://msdn.microsoft.com/en-us/library/aa702682.aspx

在AppDomain中,HTTP运行时实现的功能适用于ASP.NET内容,但不适用于WCF。ASP.NET应用程序平台的许多特定于HTTP的功能不适用于托管在其中的WCF服务。包含ASP.NET内容的AppDomain。这些功能的示例包括:

  • HttpContext :从WCF服务中访问时,Current始终为null。 改为使用RequestContext。

就在那之下:

这些限制仅适用于IIS应用程序中托管的WCF服务.ASP内容的行为不受WCF存在的影响。 需要传统上由HTTP管道提供的功能的WCF应用程序应考虑使用WCF等效项,它们是独立于主机和传输的:

OperationContext ,而不是 HttpContext 。“

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

using System.Web.Routing;

..为了解决这个问题:

public RequestContext(
HttpContextBase httpContext,
RouteData routeData

我已经到了 的地步,我对进一步的行动感到非常不确定 。我已经阅读了一些关于 ASP.NET MVC 的内容,并且它使用了“路由”,但我并不是真的在那里 - 我只是想重建这个以便它可以使用更快的绑定来提高性能。

希望我的问题很明确,而且我没有为你提供过多的建议。

2 个答案:

答案 0 :(得分: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));

有关Path.GetFullPath的使用情况,请参阅this question

答案 1 :(得分:1)

请参阅How to get working path of a wcf application?

的第二个答案
string mappedPath = string.Format(@"{0}\UploadWorkArea\", System.Web.Hosting.HostingEnvironment.ApplicationPhysicalPath);

我是否遗漏了某些东西或者您需要的是什么?