Служба WCF - данные отклоняются практически мгновенно в зависимости от размера, несмотря на большие максимальные значения - PullRequest
3 голосов
/ 18 января 2011

У меня есть веб-служба WCF с одним работающим веб-методом, который принимает один строковый параметр. У меня есть приложение WinForms, которое ссылается на веб-сервис WCF, и все это работает на .NET 4.0.

Проблема заключается в том, что когда я вызываю веб-метод со слишком большим количеством данных для строковых данных (около 4 МБ), это отлаживает как клиент, так и сервер на моей локальной машине (Win 7 Pro 64bit, IIS 7), я получаю следующую ошибку (внутренний исключение, исключение):

Запрос был прерван: Запрос был отменен.

Ошибка (Запрос был прерван: запрос был отменен) передача данных по HTTP канал.

При работе на производственном сервере я получаю другое сообщение (глупо, что я его не копировал), говорящее о том, что что-то вроде сервера могло прервать соединение или подобное.

Если я уменьшу данные примерно до половины (2 МБ), все будет работать нормально. Разочарование в том, что я установил все настройки конфигурации, сбросил IIS, перезагрузил компьютер, но он все еще остается.

Код проверки веб-службы получает удар, проверяет пользователя в порядке, а затем, как только он выходит из проверки, выводит указанное выше сообщение обратно клиенту. Трассировка стека в методе проверки (мой код) показывает только материал .NET, поэтому мой код больше не нужно отлаживать, 8 (.

На стороне сервера у меня это есть в web.config:

<system.serviceModel>
<serviceHostingEnvironment aspNetCompatibilityEnabled="true" multipleSiteBindingsEnabled="true"/>
<services>
    <service name="MyNS.MyService" behaviorConfiguration="MyNS.MyServiceBehavior">
        <endpoint binding="wsHttpBinding" bindingConfiguration="httpWithMessageSecurity" contract="MyNS..MyService">
            <identity>
                <dns value="localhost"/>
            </identity>
        </endpoint>
        <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/>
    </service>
</services>
<behaviors>
    <serviceBehaviors>
        <behavior name="MyNS.MyServiceBehavior">
            <serviceCredentials>
                <serviceCertificate findValue="Server" storeLocation="LocalMachine" storeName="My" x509FindType="FindBySubjectName"/>
                <userNameAuthentication userNamePasswordValidationMode="Custom" customUserNamePasswordValidatorType="MyNS.Validators.MyServiceUserValidator, MyNS./>
            </serviceCredentials>
            <serviceMetadata httpGetEnabled="true"/>
            <serviceDebug includeExceptionDetailInFaults="true"/>
        </behavior>
        <behavior name="">
            <serviceMetadata httpGetEnabled="true"/>
            <serviceDebug includeExceptionDetailInFaults="false"/>
        </behavior>
    </serviceBehaviors>
</behaviors>
<bindings>
    <wsHttpBinding>
        <binding name="httpWithMessageSecurity" 
                 maxReceivedMessageSize="2147483647"
                 maxBufferPoolSize="2147483647">
            <readerQuotas
                maxBytesPerRead="2147483647"
                maxNameTableCharCount="2147483647"
                maxArrayLength="2147483647"
                maxStringContentLength="2147483647"/>
            <security mode="Message">
                <message clientCredentialType="UserName"/>
            </security>
        </binding>
    </wsHttpBinding>
</bindings>

На стороне клиента у меня это есть в app.config:

<system.serviceModel>
<bindings>
    <wsHttpBinding>
        <binding name="serviceHttpBinding"
                 maxBufferPoolSize="2147483647"
                 maxReceivedMessageSize="2147483647"
                 messageEncoding="Text"
                 textEncoding="utf-8"
                 sendTimeout="01:00:00"
                 closeTimeout="00:00:20"
                 openTimeout="00:00:20"
                 receiveTimeout="00:20:00">
            <readerQuotas
                maxBytesPerRead="2147483647"
                maxNameTableCharCount="2147483647"
                maxArrayLength="2147483647"
                maxStringContentLength="2147483647"/>
            <security mode="Message">
                <message clientCredentialType="UserName" negotiateServiceCredential="true"
                  algorithmSuite="Default" />
            </security>
        </binding>
    </wsHttpBinding>
</bindings>
<behaviors>
    <endpointBehaviors>
        <behavior name="clientServerBehaviour">
            <clientCredentials>
                <serviceCertificate>
                    <authentication certificateValidationMode="PeerOrChainTrust"/>
                </serviceCertificate>
            </clientCredentials>
        </behavior>
    </endpointBehaviors>
</behaviors>
<client>
    <endpoint address="http://mymachine/TheServices/Services/MyService.svc"
      binding="wsHttpBinding" bindingConfiguration="serviceHttpBinding"
      contract="DirectorySubmitService.IDirectorySubmitService" name="WSHttpBinding_IDirectorySubmitService">
        <identity>
            <dns value="Server" />
        </identity>
    </endpoint>
</client>

РЕДАКТИРОВАТЬ 1: После включения отладочных символов в VS, после завершения моего кода проверки в службе WCF я получаю следующие исключения: System.Web.HttpException: превышена максимальная длина Стек: System.Web.HttpRequest.GetEntireRawContent ()

Тогда: System.ServiceModel.CommunicationException: превышена максимальная длина Стек: System.ServiceModel.Activation.HostedHttpRequestAsyncResult.GetInputStream ()

Последующие исключения CommunicationException относятся к каналам и т. Д., Но все они являются одним и тем же сообщением об ошибке.

Я все так проверил пул приложений в IIS, который был установлен как 30 МБ в качестве предела запроса, поэтому я исчерпал максимальные пределы, которые я могу увеличить, так что это сообщение - настоящий удар по лицу.

Любая помощь будет принята с благодарностью.

1 Ответ

0 голосов
/ 21 января 2011

Оказывается, что элемент httpRuntime web.config, который я поместил, чтобы установить лимит запроса в 50 МБ, игнорировался, потому что в указанном пути расположения отсутствовал уровень папки, т.е. location path = "MyService.svc "вместо пути к местоположению =" Services / MyService.svc ".

Чистый результат в том, что он использовал ограничение по умолчанию в 4 МБ, которое по причине дало сообщение о превышении максимальной длины, потому что это был именно тот случай.

Doh!

...