我正在使用 WCF 在数据库(C#)中上传文件,但出现此错误。远程服务器返回意外响应 (413) 请求实体太大。
IService.cs 中的代码
[OperationContract]
void UploadFile(RemoteFileInfo request);
[MessageContract] 公共类 DownloadRequest { [MessageBodyMember] 公共字符串文件名;}
[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>
任何人都可以在我犯错的地方帮助我...谢谢