我的任务是管理一个 ASP.Net WebForms 应用程序,该应用程序与由 Windows 服务托管的 WCF 服务进行通信。用于服务的绑定是 netTcpBinding。
该服务公开了上传和下载“文件”的方法。用户选择上传文件,HttpPostFile.InputSteam 直接作为服务“上传”方法中的参数传递给服务。服务将流作为字节数组保存到数据库[数据库字段数据类型为 varbinary (max)]。
文件下载数据流本质上是相反的过程。从数据库中检索字节;加载到 WCF 服务中的 MemoryStream;然后返回到 Web 应用程序。
我已经在上述操作的每个步骤中捕获了流(发送/接收)中包含的数据 - 在客户端(Web 应用程序)和服务上。我已经遍历并将每个流中包含的字节写到一个平面文件中。
每种情况下的字节数组都是相同的 [byte value; 和流中的字节数],文件下载操作除外。在流从 WCF 服务返回到 Web 应用程序的位置。这里接收到的字节数是正确的,但只填充了前 255 个字节。剩余字节的值为零
我已经对绑定值进行了许多实验性更改 - 在服务的客户端中 - 因为我相信问题一定出在此处。迄今为止,我还没有以任何方式影响返回的字节的状态。客户端和服务的日志不显示任何抛出异常或任何其他问题。
我在为客户端和服务器应用程序设置正确的绑定(和其他配置)属性组合方面没有太多经验——过去依赖于默认值。我们需要将服务和客户端配置为传输允许的最大文件大小。不幸的是,我不能使用 MTOM。
这篇文章和链接,没有给我任何见解。到目前为止,我还没有找到其他有用的信息。
希望有人可以帮助我解决问题。以下是我正在使用的绑定:
客户端 [web.config]:
<bindings>
<netTcpBinding>
<binding name="TCP"
closeTimeout="00:01:00"
openTimeout="00:10:00"
receiveTimeout="00:01:00" sendTimeout="00:01:00"
transferMode="Streamed"
maxBufferPoolSize="512"
maxBufferSize="2147483647"
maxConnections="10"
maxReceivedMessageSize="2147483647">
<readerQuotas maxDepth="32"
maxStringContentLength="2147483647"
maxArrayLength="2147483647"
maxBytesPerRead="4096"
maxNameTableCharCount="2147483647" />
<reliableSession ordered="true" inactivityTimeout="00:10:00"
enabled="false" />
<security mode="Transport">
<transport clientCredentialType="Windows" protectionLevel="EncryptAndSign" />
<message clientCredentialType="Windows" />
</security>
</binding>
</netTcpBinding>
服务:
<netTcpBinding>
<binding name="netTCP"
closeTimeout="00:01:00"
openTimeout="00:01:00"
receiveTimeout="00:01:00" sendTimeout="00:01:00"
transferMode="Streamed"
listenBacklog="30"
maxBufferPoolSize="512"
maxBufferSize="2147483647"
maxConnections="30"
maxReceivedMessageSize="2147483647"
portSharingEnabled="true">
<readerQuotas maxDepth="32"
maxStringContentLength="2147483647"
maxArrayLength="2147483647"
maxBytesPerRead="4096"
maxNameTableCharCount="2147483647" />
</binding>
</netTcpBinding>