WCF服务:文件上载以协议异常结束:超出MaxArraylength

时间:2013-06-05 07:19:28

标签: wcf iis file-upload

我正在编写一个Web服务,其用法如下:

我有一个前端作为dll,意味着我有一个带有wpf窗口的库项目。 该库应从其他程序调用。 后端WCF服务托管在外部IIS上,前端通过controller.dll调用webservice方法,其中引用了wcf服务。

我已经在这里阅读了几篇帖子,并且已经从谷歌那里了解了同样的问题...但我无法解决这个问题。

我有一个虚拟窗体,调用frontend.dll。 该项目获得了app.config:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <system.serviceModel>
    <bindings>
      <basicHttpBinding>
        <binding name="BasicHttpBinding_IService" closeTimeout="00:01:00"
            openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:10:00"
            allowCookies="false" bypassProxyOnLocal="false" hostNameComparisonMode="StrongWildcard"
            maxBufferSize="2147483647" maxBufferPoolSize="2147483647" maxReceivedMessageSize="2147483647"
            messageEncoding="Text" textEncoding="utf-8" transferMode="Buffered"
            useDefaultWebProxy="true">
          <readerQuotas maxDepth="32" maxStringContentLength="2147483647" maxArrayLength="2147483647"
              maxBytesPerRead="2147483647" maxNameTableCharCount="2147483647" />
          <security mode="None">
            <transport clientCredentialType="None" proxyCredentialType="None"
                realm="" />
            <message clientCredentialType="UserName" algorithmSuite="Default" />
          </security>
        </binding>
      </basicHttpBinding>
    </bindings>
    <client>
      <endpoint address="http://Hidden-ip/TicketReportService.svc"
          binding="basicHttpBinding" bindingConfiguration="BasicHttpBinding_IService"
          contract="ServiceReference.IService" name="BasicHttpBinding_IService" />
    </client>
  </system.serviceModel>
</configuration>

我知道,每个想要调用我的frontend.dll的程序都需要将绑定/端点配置放在他们自己的app.config中,如果我像我在这里描述的那样继续。 这只是一个例子,后来我在我的controller.dll中进行了programatically的绑定/端点配置,所以我不需要配置文件......但那是另一个话题。

如果我调用我的方法,通过网络服务上传文件我有两个场景:

如果文件&gt; 16kb和&lt; ~30kb我得到一个protoccol异常,那告诉我"MaxArrayLength" (16384) was exceeded

如果我尝试上传大约60kb的文件,我也会得到一个protocoll异常,但只有信息:“remoteserver returned unexpected answer.(400) bad request.

如果查看app.config,则将maxarray长度设置为int32.max值。 另外,如果我检查调用该方法的对象的绑定,它告诉我maxarraylength是从app.config中获取的....但我仍然收到错误消息。

我错在哪里? 这是一个客户端问题,我不是吗?

在IIS上我的服务web.config中,我得到了以下内容:

<?xml version="1.0" encoding="utf-8"?>
<configuration>
    <system.serviceModel>
        <services>
            <service behaviorConfiguration="BackendService.Behavior" name="MyNamespaye.Service">
                <endpoint address="" binding="basicHttpBinding" contract="MyNamespaye.IService" />
                <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
            </service>
        </services>
        <behaviors>
            <serviceBehaviors>
                <behavior name="BackendService.Behavior">
                    <serviceMetadata httpGetEnabled="true"/>
                    <serviceDebug includeExceptionDetailInFaults="false" />
                </behavior>
            </serviceBehaviors>
        </behaviors>
    </system.serviceModel>
    <connectionStrings>
        <add name="CustomerEntities" connectionString="metadata=res://*/CustomerModel.csdl|res://*/CustomerModel.ssdl|res://*/CustomerModel.msl;provider=MySql.Data.MySqlClient;provider connection string=&quot;server=hidden-ip;User Id=root;database=fromcloud;password=hidden-pw;Persist Security Info=True&quot;" providerName="System.Data.EntityClient" />
        <add name="DocumentEntities" connectionString="metadata=res://*/DocumentModel.csdl|res://*/DocumentModel.ssdl|res://*/DocumentModel.msl;provider=MySql.Data.MySqlClient;provider connection string=&quot;server=hidden-ip;User Id=root;password=hidden-pw;Persist Security Info=True;database=fromcloud&quot;" providerName="System.Data.EntityClient" />
    </connectionStrings>
</configuration>

1 个答案:

答案 0 :(得分:0)

......自己解决了。不知道它也必须在服务端进行配置!

new web.config:

<?xml version="1.0" encoding="utf-8"?>
<configuration>
    <system.serviceModel>
        <bindings>
            <basicHttpBinding>
                <binding name="BasicHttpBinding_IService" closeTimeout="00:10:00"
                    openTimeout="00:10:00" receiveTimeout="00:10:00" sendTimeout="00:10:00"
                    allowCookies="false" bypassProxyOnLocal="false" hostNameComparisonMode="StrongWildcard"
                    maxBufferSize="2147483647" maxBufferPoolSize="2147483647" maxReceivedMessageSize="2147483647"
                    messageEncoding="Text" textEncoding="utf-8" transferMode="Buffered"
                    useDefaultWebProxy="true">
                    <readerQuotas maxDepth="32" maxStringContentLength="2147483647" maxArrayLength="2147483647"
                        maxBytesPerRead="2147483647" maxNameTableCharCount="2147483647" />
                    <security mode="None">
                        <transport clientCredentialType="None" proxyCredentialType="None"
                            realm="" />
                        <message clientCredentialType="UserName" algorithmSuite="Default" />
                    </security>
                </binding>
            </basicHttpBinding>
        </bindings>
        <services>
            <service behaviorConfiguration="BackendService.Behavior" name="MyNamespace.Service">
              <host>
                  <baseAddresses>
                    <add baseAddress="http://localhost:1111/"/>
                  </baseAddresses>
            </host>
             <endpoint address="http://MyIP/TicketReportService.svc"
                  binding="basicHttpBinding" 
                  bindingConfiguration="BasicHttpBinding_IService"
                  contract="Mynamespace.BackendService.IService" 
                  name="ticketReport_endpoint" />

            </service>
        </services>
        <behaviors>
            <serviceBehaviors>
                <behavior name="BackendService.Behavior">
                    <serviceMetadata httpGetEnabled="true"/>
                    <serviceDebug includeExceptionDetailInFaults="false" />
                </behavior>
            </serviceBehaviors>
        </behaviors>
    </system.serviceModel>
    <connectionStrings>
        <add name="CustomerEntities" connectionString="metadata=res://*/CustomerModel.csdl|res://*/CustomerModel.ssdl|res://*/CustomerModel.msl;provider=MySql.Data.MySqlClient;provider connection string=&quot;server=fwefwef;User Id=root;database=fromcloud;password=fwefw;Persist Security Info=True&quot;" providerName="System.Data.EntityClient" />
        <add name="DocumentEntities" connectionString="metadata=res://*/DocumentModel.csdl|res://*/DocumentModel.ssdl|res://*/DocumentModel.msl;provider=MySql.Data.MySqlClient;provider connection string=&quot;server=fwefwef;User Id=root;password=fwef;Persist Security Info=True;database=fromcloud&quot;" providerName="System.Data.EntityClient" />
    </connectionStrings>
</configuration>

...只是做了另一个谷歌搜索,找到了一个适当的web.config示例。 无论如何,感谢任何阅读OP的人。