c# - 如何使用 WCF 服务保存文件

标签 c# asp.net wcf web-services sql-server-2008

我正在使用 WCF 在数据库 (C#) 中上传文件,但出现此错误。 远程服务器返回意外响应 (413) 请求实体太大。

IService.cs 中的代码

[OperationContract]
  void UploadFile(RemoteFileInfo request);

[消息合约] 公共(public)类 DownloadRequest { [MessageBodyMember] 公共(public)字符串文件名;

[MessageContract]
public class RemoteFileInfo : IDisposable
{
    [MessageHeader(MustUnderstand = true)]
    public string FileName;     

    [MessageHeader(MustUnderstand = true)]
    public int ItemID;
    [MessageHeader(MustUnderstand = true)]
    public string FileExt;
    [MessageBodyMember(Order = 1)]
    public System.IO.Stream FileByteStream;

    public void Dispose()
    {
        if (FileByteStream != null)
        {
            FileByteStream.Close();
            FileByteStream = null;
        }
    }

Service.svc.cs 中的代码

 public void UploadFile(RemoteFileInfo request)
        {
            AttachmentDTO objDTO = new AttachmentDTO();
            //FileStream targetStream = null;
            Stream stream = request.FileByteStream;
            const int bufferLen = 65000;
           // byte[] buffer = new byte[bufferLen];
           //  objDTO.FileData = buffer;
            AttachmentBLL objBLL = new AttachmentBLL();
            try
            {
                byte[] readBuffer = new byte[bufferLen];

                int totalBytesRead = 0;
                int bytesRead;

                while ((bytesRead = stream.Read(readBuffer, totalBytesRead, readBuffer.Length - totalBytesRead)) > 0)
                {
                    totalBytesRead += bytesRead;

                    if (totalBytesRead == readBuffer.Length)
                    {
                        int nextByte = stream.ReadByte();
                        if (nextByte != -1)
                        {
                            byte[] temp = new byte[readBuffer.Length * 2];
                            Buffer.BlockCopy(readBuffer, 0, temp, 0, readBuffer.Length);
                            Buffer.SetByte(temp, totalBytesRead, (byte)nextByte);
                            readBuffer = temp;
                            totalBytesRead++;
                        }
                    }
                }

                byte[] buffer = readBuffer;
                if (readBuffer.Length != totalBytesRead)
                {
                    buffer = new byte[totalBytesRead];
                    Buffer.BlockCopy(readBuffer, 0, buffer, 0, totalBytesRead);
                }
                objDTO.FileData = buffer;
                objDTO.FileName = request.FileName;
                objDTO.CreatedDate = DateTime.Now;
                objDTO.CreatedBy = "user";
                objDTO.IsActive = true;
                objDTO.FileExt = request.FileExt;
                objBLL.AddAttachment(objDTO);


            }
            catch (Exception ex)
            { 

            }

        }

objBLL.AddAttachment(objDTO);此方法在业务逻辑文件中。 BLL 可以与 DAL 通信,但 DAL 无法与 WCF 服务通信。

 This Code is written in page.aspx.cs file.  



 if (fuAttachment.HasFile)
            {
                string abs = fuAttachment.PostedFile.FileName;
                System.IO.FileInfo fileInfo = new System.IO.FileInfo(fuAttachment.PostedFile.FileName);

                MyService.RemoteFileInfo uploadRequestInfo = new MyService.RemoteFileInfo();

                using (System.IO.FileStream stream = new System.IO.FileStream(fuAttachment.PostedFile.FileName, System.IO.FileMode.Open, System.IO.FileAccess.Read))
                {
                    uploadRequestInfo.FileName = fuAttachment.FileName;
                    uploadRequestInfo.Length = fileInfo.Length;
                    uploadRequestInfo.FileByteStream = fuAttachment.FileContent;
                    uploadRequestInfo.ItemID = itemId;
                    uploadRequestInfo.FileExt = fuAttachment.PostedFile.ContentType;
                    client.UploadFile(uploadRequestInfo.FileExt, uploadRequestInfo.FileName, uploadRequestInfo.ItemID, uploadRequestInfo.FileByteStream);

                }
            }

网络配置

<binding name="WSHttpBinding_IEMRProWCFService" closeTimeout="04:01:00"
          openTimeout="04:01:00" receiveTimeout="04:10:00" sendTimeout="04:01:00"
          bypassProxyOnLocal="false" transactionFlow="false" hostNameComparisonMode="StrongWildcard"
          maxBufferPoolSize="2147483647" maxReceivedMessageSize="2147483647" messageEncoding="Text"
          textEncoding="utf-8" useDefaultWebProxy="true" allowCookies="false">
          <readerQuotas maxDepth="128"
       maxStringContentLength="2147483647" maxArrayLength="2147483647"
       maxBytesPerRead="2147483647" maxNameTableCharCount="2147483647" />
          <reliableSession ordered="true" inactivityTimeout="00:10:00"
            enabled="false" />
          <security mode="None">
            <transport clientCredentialType="None"
                    proxyCredentialType="None" realm="" />
            <message clientCredentialType="UserName" algorithmSuite="Default" />
          </security>
        </binding>

和服务.config

<?xml version="1.0" encoding="UTF-8"?>
<configuration>

  <system.web>
    <compilation debug="true" />
    <httpRuntime maxRequestLength="2147483647" />

  </system.web>

  <system.serviceModel>
    <services>
      <service name="WCFService.EMRProWCFService">
        <endpoint address="" binding="wsHttpBinding" contract="WCFService.IEMRProWCFService">
          <identity>
            <dns value="localhost" />
          </identity>
        </endpoint>
        <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
      </service>
    </services>



    <behaviors>
      <serviceBehaviors>
        <behavior>
          <!-- To avoid disclosing metadata information, set the value below to false and remove the metadata endpoint above before deployment -->
          <serviceMetadata httpGetEnabled="true" />
          <!-- To receive exception details in faults for debugging purposes, set the value below to true.  Set to false before deployment to avoid disclosing exception information -->
          <serviceDebug includeExceptionDetailInFaults="true" />
        </behavior>
      </serviceBehaviors>
    </behaviors>
    <serviceHostingEnvironment multipleSiteBindingsEnabled="true" />
    <bindings>
      <webHttpBinding>
        <binding name="WebConfiguration"
                 maxBufferSize="65536"
                 maxReceivedMessageSize="2147483647"
                 transferMode="Streamed">
        </binding>
      </webHttpBinding>
    </bindings>
  </system.serviceModel>
  <system.webServer>
    <modules runAllManagedModulesForAllRequests="true" />
    <directoryBrowse enabled="true" />
  </system.webServer>

</configuration>

任何人都可以帮助我在哪里我犯了错误... 谢谢

最佳答案

你需要做的地方是web config,你需要添加服务行为,你可以设置数据的大小。比如像这样,

<?xml version="1.0"?>
<configuration>
  <system.web>
    <httpRuntime executionTimeout="4800" maxRequestLength="2097150"/>
    <compilation debug="true"/>
  </system.web>
  <system.serviceModel>
    <bindings>
      <basicHttpBinding/>
      <customBinding>
        <binding name="LargeSilverlight" closeTimeout="00:21:00" openTimeout="00:20:00" receiveTimeout="00:20:00" sendTimeout="00:50:00">
          <textMessageEncoding maxReadPoolSize="2147483647" maxWritePoolSize="2147483647">
            <readerQuotas maxDepth="2147483647" maxStringContentLength="2147483647" maxArrayLength="2147483647" maxBytesPerRead="2147483647" maxNameTableCharCount="2147483647"/>
          </textMessageEncoding>
          <httpTransport maxBufferPoolSize="2147483647" maxReceivedMessageSize="2147483647" maxBufferSize="2147483647"/>
        </binding>
      </customBinding>
    </bindings>
    <client/>
    <!--SERVICE-->
    <services>
      <service name="WCFService.EMRProWCFService" behaviorConfiguration="SilverlightWCFLargeDataApplication">
        <endpoint address="" binding="customBinding" bindingConfiguration="LargeSilverlight" behaviorConfiguration="SilverlightWCFLargeDataApplication" contract="WCFService.IEMRProWCFService"/>
      </service>
    </services>
    <!--BEHAVIOR-->
    <behaviors>
      <serviceBehaviors>
        <behavior name="SilverlightWCFLargeDataApplication">
          <serviceMetadata httpGetEnabled="true"/>
          <serviceDebug includeExceptionDetailInFaults="false"/>
          <dataContractSerializer maxItemsInObjectGraph="2147483647"/>
        </behavior>
      </serviceBehaviors>
      <endpointBehaviors>
        <behavior name="SilverlightWCFLargeDataApplication">
          <dataContractSerializer maxItemsInObjectGraph="2147483647"/>
        </behavior>
      </endpointBehaviors>
    </behaviors>
  </system.serviceModel>
  <system.webServer>
    <security>
      <requestFiltering>
        <requestLimits maxAllowedContentLength="500000000"/>
      </requestFiltering>
    </security>
    <modules runAllManagedModulesForAllRequests="true"/>
  </system.webServer>
</configuration>

如果这不起作用,您需要遵循一种机制来压缩数据并通过网络服务发送。您可以找到大量示例。

关于c# - 如何使用 WCF 服务保存文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14018157/

相关文章:

c# - 从第二个组合框中删除第一个组合框的选定项目 C# Windows 窗体应用程序

c# - 使用 Membership.GetUser() 时发生错误

c# - 在 C# 中从 Visual Dataflex 6 读取数据

asp.net - 如何使用 MSBuild 发布 Asp.NET Web 应用程序?

Silverlight Web服务问题

.net - 如何从 WSDL 创建可空字段/变量而不是额外的字段/变量

c# - 带有构造函数参数的自动映射对象

c# - ‘之后的标题大小写大写字母

asp.net - 字 rune 字中的字符太多?

wcf - FaultException 和自定义异常 WCF