gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 13:49:47 25 4
gpt4 key购买 nike

我正在使用 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com