3

我创建了一个与我的应用程序 c# 相关的 webService。

所有方法都可以完美运行。然而,一个函数有问题“ TimeOut ”。此方法应返回一个整数数组,其中包含大约 [1,000,000] (100 万)个整数。 我正确地获得了数据,但在调用我的方法后大约4-5 分钟!100 万个整数的表等待大约 5 分钟是否正常?我发现我的应用程序可能需要太长时间和烦人。您知道发送大数据的解决方案或更好的方法吗?

  • 其他压缩方法?
  • 其他响应格式(xml、数组..)?

这是我在服务器端的配置文件:

网页配置

<?xml version="1.0"?>
<configuration>

  <system.web>
      <customErrors mode="Off"/>
      <compilation debug="true" targetFramework="4.0" />
  </system.web>
  <system.serviceModel>

    <diagnostics performanceCounters="Default" />
    <bindings>
      <basicHttpBinding>
        <binding name="Elevation_ServiceSoap" closeTimeout="00:02:00" messageEncoding="Mtom"
          openTimeout="00:02:00" receiveTimeout="00:02:00" sendTimeout="00:02:00"
          allowCookies="true" maxBufferPoolSize="2147483647" maxBufferSize="2147483647"
          maxReceivedMessageSize="2147483647">
          <readerQuotas maxDepth="32" maxStringContentLength="2147483647"
            maxArrayLength="2147483647" maxBytesPerRead="2147483647" maxNameTableCharCount="2147483647" />
        </binding>
        <binding name="BasicHttpBinding_IGeocodeService" allowCookies="true"
          maxBufferPoolSize="2147483647" maxBufferSize="2147483647" maxReceivedMessageSize="2147483647">
          <readerQuotas maxDepth="32" maxStringContentLength="2147483647"
            maxArrayLength="2147483647" maxBytesPerRead="2147483647" maxNameTableCharCount="2147483647" />
        </binding>
        <binding name="BasicHttpBinding_IImageryService" allowCookies="true"
          maxBufferPoolSize="2147483647" maxBufferSize="2147483647" maxReceivedMessageSize="2147483647">
          <readerQuotas maxDepth="32" maxStringContentLength="2147483647"
            maxArrayLength="2147483647" maxBytesPerRead="2147483647" maxNameTableCharCount="2147483647" />
        </binding>
      </basicHttpBinding>
    </bindings>

    <client>
      <endpoint address="http://gisdata.usgs.gov/XMLWebServices2/Elevation_Service.asmx"
        binding="basicHttpBinding" bindingConfiguration="Elevation_ServiceSoap"
        contract="ElevationService.Elevation_ServiceSoap" name="Elevation_ServiceSoap" />
      <endpoint address="http://dev.virtualearth.net/webservices/v1/geocodeservice/GeocodeService.svc"
        binding="basicHttpBinding" bindingConfiguration="BasicHttpBinding_IGeocodeService"
        contract="GeocodeService.IGeocodeService" name="BasicHttpBinding_IGeocodeService" />
      <endpoint address="http://dev.virtualearth.net/webservices/v1/imageryservice/imageryservice.svc"
        binding="basicHttpBinding" bindingConfiguration="BasicHttpBinding_IImageryService"
        contract="ImageryService.IImageryService" name="BasicHttpBinding_IImageryService" />
    </client>
    <behaviors>
      <serviceBehaviors>
        <behavior>
          <!-- To avoid disclosing metadata information, set the value below to false and remove the metadata endpoint above before deployment - binaryHttp -->
          <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"/>
          <dataContractSerializer maxItemsInObjectGraph="10000000"/>
        </behavior>
      </serviceBehaviors>
    </behaviors>
    <serviceHostingEnvironment multipleSiteBindingsEnabled="true" />
  </system.serviceModel>
 <system.webServer>
    <modules runAllManagedModulesForAllRequests="true"/>
  </system.webServer>

</configuration>

这是我在客户端的配置文件:

应用程序配置

    <?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <system.serviceModel>
        <bindings>
            <basicHttpBinding>
                <binding name="BasicHttpBinding_IService1" closeTimeout="00:02:00"
                    openTimeout="00:02:00" receiveTimeout="00:02:00" sendTimeout="00:02:00"
                    allowCookies="true" maxBufferPoolSize="2147483647" maxBufferSize="2147483647"
                    maxReceivedMessageSize="2147483647">
                    <readerQuotas maxDepth="32" maxStringContentLength="2147483647"
                        maxArrayLength="2147483647" maxBytesPerRead="2147483647" maxNameTableCharCount="2147483647" />
                </binding>
            </basicHttpBinding>
        </bindings>
        <behaviors >
            <serviceBehaviors>
                <behavior name="debug">
                    <serviceDebug includeExceptionDetailInFaults="true" />
                    <dataContractSerializer maxItemsInObjectGraph="10000000"/>
                </behavior>
            </serviceBehaviors>
        </behaviors>

        <client>
            <endpoint address="http://blalbloslblalbla/WebServiceArcadia_World_deploy/Service1.svc"
                binding="basicHttpBinding" bindingConfiguration="BasicHttpBinding_IService1"
                contract="WebServiceArcadia_World.IService1" name="BasicHttpBinding_IService1" />
        </client>
        <services>
            <service name="WebServiceArcadia_World_deploy.IService1">

            </service>
        </services>
    </system.serviceModel>
    <system.web>
        <httpRuntime executionTimeout="90" maxRequestLength="1048576" useFullyQualifiedRedirectUrl="false" minFreeThreads="8" minLocalRequestFreeThreads="4" appRequestQueueLimit="100"/>
    </system.web>
</configuration>
4

4 回答 4

1

最简单的解决方案是对结果进行分页:设置 WCF 服务可以返回的整数限制(例如 2000),并调用它直到响应包含 0 数字。

于 2013-03-25T16:13:12.333 回答
1

如果您的服务和客户端在同一台电脑上运行,请尝试 net.pipe 绑定,如果不是 - 请尝试 net.tcp 绑定。

于 2013-03-26T13:13:23.487 回答
1

我认为您应该尝试对结果进行分页,以便为每个请求带来更少的数据。

于 2013-03-25T16:11:08.207 回答
0

下午好。最后,正确的解决方案是更改编码模式!实际上默认 [WCF] 发送响应格式“xml”全文。这是非常沉重的!设计了一个整数数组。对于每个索引/值 [WCF] 标签都会添加格式中不必要的文本:示例。

XML

<!-- Too heavy with text / tag useless for the customer -->
<xmlns blabalala .........  />
<item>11</item>
<item>2</item>
<item>41</item>
.....

简单的二进制格式/或 Json更轻等...:

11,2,41,2,6,7,34,8,43,12,76, .....

无论如何,我终于改变了传输二进制的方法!在选择编码方法和发送流媒体或其他方面对我有很大帮助的页面!

微软在此处的文章 ->大数据和流式处理 - WCF

不时变化!~3min - ~3min 30sec - ~4min ... 不过已经好一点了。我认为不幸的是,没有其他方法可以使用 [WCF] 更快地做到这一点,否则使用“WebSocket”将是最好的解决方案。对于我的应用程序,我挂起使用 [wcf] .. 我认为我的方法添加了 webService 访问模式“异步”以允许在我下载期间添加一个 progressBar。欢迎其他想法;-)

于 2013-03-26T13:09:02.667 回答