Как отправить файл PDF через службу WCF? - PullRequest
0 голосов
/ 27 декабря 2018

В настоящее время я использую Visual Studio 2015 и создаю веб-сайт .Я пытался использовать OperationContracts и ServiceContracts с 3-уровневой архитектурой, однако я мог выполнять только основные операции (создание, получение, обновление, удаление с использованием обычных строк / int).

Я хочу попросить Веб-служба WCF , возможно ли получить PDF-файл из другой базы данных?

Вот сценарий, над которым я работаю:

  1. Компания A использует веб-службу (WCF) для извлечения данных счета-фактуры (все в различных атрибутах, например, InvoiceNum, PaymentAmt и т. Д.) От поставщика A.
  2. Компания A использует внешний API для заполнениявсе поля в шаблон и загрузить в виде файла PDF.
  3. Компания A использует веб-сервис (WCF) для вставки PDF-счета-фактуры в базу данных поставщика A и store в виде файла PDF.
  4. Компания A сохраняет PDF как тип BLOB в своей собственной базе данных (SQL LocalDB).

Возможен ли приведенный выше сценарий?Если это возможно, есть ли какие-либо руководящие принципы / известные ссылки, на которые я могу ссылаться / пытаться реализовать сценарий?

1 Ответ

0 голосов
/ 28 декабря 2018

Pdf можно рассматривать как файл.Вы можете использовать byte [] для передачи файла.Ниже приведен мой простой образец.

Мой контракт.

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

Мой сервис.AspNetCompatibilityRequirementsMode.Allowed используется для включения HttpContext, иначе он будет нулевым.Здесь я непосредственно сохраняю файл на сервере, если вы хотите сохранить его в sqlserver, просто используйте поле varbinary для сохранения байта [] файла PDF.

 [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);

    }
}

Мой web.config службы wcf.Конфигурация привязки ECMSBindingConfig используется для включения загрузки больших данных, или служба не позволяет слишком большие данные.Для aspNetCompatibilityEnabled в serviceHostingEnvironment также должно быть задано значение true, иначе HttpContext будет иметь значение null.

 <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"
   />

Мой клиент.Веб-форма пользователя в качестве образца.

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

Код позади.Здесь я использую channelFacotory, он похож на клиент, сгенерированный Visual Studio

 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);
        }
    }

Web.config клиента.

 <client>
  <endpoint name ="upload" address="http://localhost:62193/uploadPdf.svc" binding="basicHttpBinding" contract="ServiceInterface.LargeData.IFileUpload" />

</client>

Я предполагаю, что пользователь загружает PDF, если вы хотите загрузитьдругие файлы, вы можете добавить расширение файла в качестве параметра службы.Другая операция должна быть похожей.

...