【问题标题】:Convert ASMX webservice using HTTP to WCF webservice using netTcpBinding means alternative to using HttpContext将使用 HTTP 的 ASMX Web 服务转换为使用 netTcpBinding 的 WCF Web 服务意味着使用 HttpContext 的替代方法
【发布时间】:2011-11-03 23:34:37
【问题描述】:

我一直在研究 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 作为在这些 sn-ps 中:

[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。这些功能的示例包括:

  • 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 的内容,它使用了“routing”,但我并不真正在那里 - 我只是在考虑重建它以便它可以使用更快的绑定来提高性能。

希望我的问题很清楚,我并没有过多地为您提供一些建议。

【问题讨论】:

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


    【解决方案1】:

    请参阅How to get working path of a wcf application?的第二个答案

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

    我错过了什么还是你只需要这些?

    【讨论】:

    • 谢谢!当我在您提供的链接中阅读“第二个答案”时,不需要在 ASPNetCompatibility 模式下运行 WCF Web 服务,所以我会尝试,这可能会让我更接近 NetTcpBinding。
    【解决方案2】:

    我尝试了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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-04-10
      • 1970-01-01
      • 1970-01-01
      • 2015-03-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多