如何通过WCF服务发送PDF文件?

时间:2018-12-27 15:16:14

标签: c# asp.net wcf pdf operationcontract

我当前正在使用Visual Studio 2015,并正在建立一个网站。我曾尝试在3层体系结构中使用OperationContracts和ServiceContracts,但是,我只能做一些基本的事情(使用正常的string / int创建,检索,更新,删除)。

我想问一下 Web Service WCF ,是否可以从另一个数据库中检索 PDF文件

这是我正在努力的情况:

  1. 公司A使用Web服务(WCF)从供应商A 检索发票数据(所有属性都不同,例如InvoiceNum,PaymentAmt等)。
  2. 公司A使用外部API将所有字段填写到模板中,然后下载为PDF文件。
  3. 公司A使用Web服务(WCF)将发票PDF 插入到供应商A的数据库中,并存储作为PDF文件。
  4. 公司A将PDF作为BLOB类型存储在其自己的数据库(SQL LocalDB)中。

以上情况是否可能?如果有可能,我可以参考/尝试使用任何准则/已知链接来实现此方案吗?

1 个答案:

答案 0 :(得分:0)

Pdf被视为一个文件。 您可以使用byte []来传输文件。 下面是我的简单示例。

我的合同。

PUBLIC

我的服务。 AspNetCompatibilityRequirementsMode.Allowed用于启用HttpContext,否则它将为null。在这里,我直接将文件保存在服务器中,如果要将文件保存在sqlserver中,只需使用varbinary字段保存pdf文件的byte []。

[ServiceContract()]
public interface  IFileUpload
{
    [OperationContract]
    void Upload(byte[] bys);
}

我的wcf服务的web.config。 bindingconfiguration ECMSBindingConfig用于启用上传大数据或该服务不允许太大的数据。 serviceHostingEnvironment的aspNetCompatibilityEnabled也应设置为true,否则HttpContext为null。

 [AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
public class FileUploadService : IFileUpload
{
    public void Upload(byte[] bys)
    {
        string filename = Guid.NewGuid().ToString()+".pdf";
        File.WriteAllBytes(HttpContext.Current.Request.MapPath("/upload/") + filename, bys);

    }
}

我的客户。用户网络表单作为示例。

 <service name="Service.CalculatorService" >
    <endpoint  binding="basicHttpBinding"  bindingConfiguration="ECMSBindingConfig" contract="ServiceInterface.ICalculatorService"></endpoint>
  </service>
  <bindings>
  <basicHttpBinding>
    <binding name="ECMSBindingConfig"  allowCookies="false"  maxBufferPoolSize="2147483647" maxBufferSize="2147483647"
      maxReceivedMessageSize="2147483647" bypassProxyOnLocal="true"  >
      <readerQuotas maxArrayLength="2147483647" maxNameTableCharCount="2147483647"
          maxStringContentLength="2147483647" maxDepth="2147483647"
          maxBytesPerRead="2147483647" />
      <security mode="None" />
    </binding>
  </basicHttpBinding>
</bindings>
 <serviceHostingEnvironment aspNetCompatibilityEnabled="true"
   />

后面有代码。在这里我使用channelFacotory,它类似于Visual Studio生成的客户端

<form id="form1" runat="server">
    <asp:FileUpload ID="FileUpload1" runat="server" />
    <asp:Button ID="Button1" runat="server" Text="upload" OnClick="Button1_Click" />
</form>

客户端的Web.config。

 protected void Button1_Click(object sender, EventArgs e)
    {
        HttpPostedFile file = FileUpload1.PostedFile;
        using (ChannelFactory<IFileUpload> uploadPdf = new ChannelFactory<IFileUpload>("upload"))
        {   
            IFileUpload fileUpload = uploadPdf.CreateChannel();
            byte[] bys = new byte[file.InputStream.Length];
            file.InputStream.Read(bys, 0, bys.Length);
            fileUpload.Upload(bys);
        }
    }

我假设用户上传pdf,如果您要上传其他文件,则可以添加文件扩展名作为服务的参数。其他操作应该类似。