【问题标题】:Accept and Return file to/from C# WebService从 C# WebService 接受和返回文件
【发布时间】:2012-03-29 01:36:59
【问题描述】:

如何在 C# 中创建一个 WebService,它将接受文件,然后在一次调用中同时返回一个文件(同步)。 我要做的是创建一个 WebService,它将接受 MS Office 文档,将该文档转换为 PDF,然后将该文件返回给调用者(在我的情况下,我使用 Java 作为客户端)

【问题讨论】:

  • 您可以创建一个 Wcf 服务将文件转换为字节,将其作为字节数组发送,并使返回类型也是字节数组。您可能需要增加发送超时,因为默认值为 1 分钟。通常你可以使用流,但我记得它在参数上有一些缺点。
  • 正如 Silvermind 所说。您可以查找 WCF 和 POST 动词。 PDF 处理只是服务器端业务。您的 WCF 方法需要向客户端返回一个对象。不确定 HttpResponse.Stream 如何应用于 WCF 方法?否则,只需返回一个 url 字符串,将在其中创建(或存储)已处理的 pdf 文件,您将客户端重定向到该文件。

标签: c# web-services


【解决方案1】:

正如 silvermind 在他的评论中所说,最好的选择是在您的网络服务中接受并返回一个字节数组。

您可以使用以下方法将文件作为字节数组加载:

public byte[] FileToByteArray(string _FileName)
{
    byte[] _Buffer = null;

    try
    {
        System.IO.FileStream _FileStream = new System.IO.FileStream(_FileName, System.IO.FileMode.Open, System.IO.FileAccess.Read);
        System.IO.BinaryReader _BinaryReader = new System.IO.BinaryReader(_FileStream);
        long _TotalBytes = new System.IO.FileInfo(_FileName).Length;
        _Buffer = _BinaryReader.ReadBytes((Int32)_TotalBytes);
        _FileStream.Close();
        _FileStream.Dispose();
        _BinaryReader.Close();
    }
    catch (Exception _Exception)
    {
        Console.WriteLine("Exception caught in process: {0}", _Exception.ToString());
    }
    return _Buffer;
}

此外,如果您已将 Web 服务实现为 WCF 服务,则可能需要调整一些设置以增加可以发送的信息量和超时时间。这是允许这样做的绑定配置示例。 (只是一个样本,可能不符合您的需求)

 <binding name="WebServiceBinding" closeTimeout="00:02:00"
            openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:02:00"
            allowCookies="false" bypassProxyOnLocal="false" hostNameComparisonMode="StrongWildcard"
            maxBufferPoolSize="524288" maxBufferSize="2147483647" maxReceivedMessageSize="2147483647"
            messageEncoding="Text" textEncoding="utf-8" transferMode="Buffered"
            useDefaultWebProxy="true">
          <readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384"
              maxBytesPerRead="4096" maxNameTableCharCount="16384" />
          <security mode="None">
            <transport clientCredentialType="None" proxyCredentialType="None"
                realm="" />
            <message clientCredentialType="UserName" algorithmSuite="Default" />
          </security>
        </binding>

【讨论】:

    【解决方案2】:

    您可以将少量二进制数据编码为 base64 字符串。

    【讨论】:

      【解决方案3】:

      这里有几个来自不同来源的教程,这也取决于您使用的是 wcf 还是 asmx。我还认为您必须创建两个单独的函数和另一个将同时调用 send 和 revive 的函数,尽管您可能希望在接收之前有一些时间进行发送。

      http://support.microsoft.com/kb/318425

      http://www.zdnetasia.com/create-a-simple-file-transfer-web-service-with-net-39251815.htm

      https://stackoverflow.com/questions/4530045/how-to-transfer-file-through-web-service

      【讨论】:

      • 为什么好久没用了??
      • 这是旧技术,WCF 为您提供了许多工具来满足现代 Web 技术/安全性。网上有大量关于此的博客文章和研究。 asmx 的优点是服务很容易设置。
      • 我完全同意,但有时人们仅限于特定框架。
      • 这就是原因之一。 Asmx force 所有部分都为 MS 类型。 WCF SOAP 可以与其他类型的系统通信。如果我没记错的话,wcf 是自 3.0 以来内置的 .net 2 的插件?抱歉我的错别字,我在手机上。
      【解决方案4】:

      最简单的方法是将 ASP.net MVC3 框架的基本库集成到您的基本 Web 项目中,然后使用返回 FileResult 类型对象的单个方法编写一个简单的 MVC 控制器。

      Scott Hanselman 发表了一篇很棒的博客文章,介绍了如何在几分钟内做到这一点: http://www.hanselman.com/blog/IntegratingASPNETMVC3IntoExistingUpgradedASPNET4WebFormsApplications.aspx

      它工作得非常好,不到 3 分钟就完成了(在 MVC3 框架集成之后)。已经有一篇关于在 MVC 中返回文件的 stackoverflow 帖子: How to create file and return it via FileResult in ASP.NET MVC?

      您好,

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-05-06
        • 1970-01-01
        • 2017-07-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多