3

В проекте, который я в настоящее время работаю, там подвергается службы WCF, которая возвращает массив хозяйствующего субъекта, давайте назовем его счет-фактура:WCF ответ слишком долго - ошибка аутентификации

Invoice[] GetInvoicesByTypeAndTime(InvoiceType invoiceType, byte startHour, byte? endHour); 

механизм аутентификации, используемый это проверка подлинности Windows, служба WCF размещается в веб-приложении, размещенном на IIS 6.

Сначала, когда я использовал данные более 64 КБ, было указано сообщение CommunicationException, в котором указано: «Максимальная квота размера сообщения для входящих сообщений (65536). Для увеличения квоты используйте свойство MaxReceivedMessageSize на соответствующем связывающий элемент ".

Хорошо, я просто увеличил в App.config значения до 65536000 (я явно добавил три нуля в конце) как MaxReceivedMessageSize и MaxBufferSize (последний, так как он жаловался в ArgumentException, что «Для TransferMode.Buffered, MaxReceivedMessageSize и Значение MaxBufferSize должно быть одинаковым. Имя параметра: bindingElement ").

Теперь я мог бы получить большие ответы ...

Пока я не ударил другой предел (я думаю) в том, что после 624 элементов странного исключение (примерно 2,2 Мб.):

System.ServiceModel.Security.MessageSecurityException: The HTTP request is unauthorized with client authentication scheme 'Negotiate'. The authentication header received from the server was 'Negotiate,NTLM'. ---> System.Net.WebException: The remote server returned an error: (401) Unauthorized. 
    at System.Net.HttpWebRequest.GetResponse() 
    at System.ServiceModel.Channels.HttpChannelFactory.HttpRequestChannel.HttpChannelRequest.WaitForReply(TimeSpan timeout) 
    --- End of inner exception stack trace --- 

стек сервера трассировки:

at System.ServiceModel.Channels.HttpChannelUtilities.ValidateAuthentication(HttpWebRequest request, HttpWebResponse response, WebException responseException, HttpChannelFactory factory) 
    at System.ServiceModel.Channels.HttpChannelUtilities.ValidateRequestReplyResponse(HttpWebRequest request, HttpWebResponse response, HttpChannelFactory factory, WebException responseException) 
    at System.ServiceModel.Channels.HttpChannelFactory.HttpRequestChannel.HttpChannelRequest.WaitForReply(TimeSpan timeout) 
    at System.ServiceModel.Channels.RequestChannel.Request(Message message, TimeSpan timeout) 
    at System.ServiceModel.Dispatcher.RequestChannelBinder.Request(Message message, TimeSpan timeout) 
    at System.ServiceModel.Channels.ServiceChannel.Call(String action, Boolean oneway, ProxyOperationRuntime operation, Object[] ins, Object[] outs, TimeSpan timeout) 
    at System.ServiceModel.Channels.ServiceChannel.Call(String action, Boolean oneway, ProxyOperationRuntime operation, Object[] ins, Object[] outs) 
    at System.ServiceModel.Channels.ServiceChannelProxy.InvokeService(IMethodCallMessage methodCall, ProxyOperationRuntime operation) 
    at System.ServiceModel.Channels.ServiceChannelProxy.Invoke(IMessage message) 

Исключение при вызваны повторно [0]:

at System.Runtime.Remoting.Proxies.RealProxy.HandleReturnMessage(IMessage reqMsg, IMessage retMsg) 
    at System.Runtime.Remoting.Proxies.RealProxy.PrivateInvoke(MessageData& msgData, Int32 type) 
    at Test2.DBS.IDbService.GetInvoicesByTypeAndTime(InvoiceType invoiceType, Byte startHour, Nullable`1 endHour) 
    at Test2.DBS.DbServiceClient.GetInvoicesByTypeAndTime(InvoiceType invoiceType, Byte startHour, Nullable`1 endHour) in D:\TEMP\Test2\Test2\Service References\DBS\Reference.cs:line 1445 
    at Test2.Program.Main(String[] args) in D:\TEMP\Test2\Test2\Program.cs:line 19 

Есть ли ограничение на аутентифицированные ответы? Есть ли ограничение по настройкам ASP.NET?

+0

Спасибо Yannick М. для переформатирования :) –

ответ

3

Я предполагаю, что вы используете аутентификацию Windows, а не 401, а не сообщение, объясняющее, как вы нарушили свои ограничения на сообщения. Когда вы отправляете запрос Windows Authenticated, WCF дважды отправляет SOAP-запрос, один раз для отказа и возвращает заголовок accepts, а второй раз отправляет его с заголовками проверки подлинности Windows.

Однако, по моему тестированию, похоже, что вы все еще получаете 401, если сообщение действительно потерпело неудачу, если бы оно прошло.

Чтобы устранить это, я должен был поставить сервер ведения журнала трассировки в:

<system.diagnostics> 
    <trace autoflush="true" /> 
    <sources> 
     <source name="System.ServiceModel" switchValue="Critical, Error, Warning"> 
     <listeners> 
      <add name="traceListener" type="System.Diagnostics.XmlWriterTraceListener" initializeData="C:\Logs\ServiceTrace.svclog"/> 
     </listeners> 
     </source> 
    </sources> 
    </system.diagnostics> 

Тогда, я должен был поставить в большие квоты читателя, как и выше (но я использовал меньшие значения):

Тогда вы, как правило, положить в пользовательском поведении, чтобы увеличить максимальное число элементов в графе объектов:

<behaviors> 
    <serviceBehaviors> 
    <behavior name="MaximumItemsBehaviour"> 
     <dataContractSerializer maxItemsInObjectGraph="2147483647" /> 
     <!-- To avoid disclosing metadata information, set the value below to false and remove the metadata endpoint above before deployment --> 
     <serviceMetadata httpsGetEnabled="true" httpGetEnabled="false" /> 
     <!-- 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> 

Вам нужно добавить атрибут «behaviourConfiguration» в ваш элемент «<system.serviceModel><services><service>» со значением «MaximumItemsBehaviour».

Другие советы я читал, но не нужно было себя добавить:

<system.web> 
    <compilation debug="true" targetFramework="4.0" /> 
    <httpRuntime maxRequestLength="2097151" /> 
    </system.web> 

И:

<system.webServer> 
    <modules runAllManagedModulesForAllRequests="true" /> 
    <security> 
     <requestFiltering> 
     <requestLimits maxAllowedContentLength="209715200"/> 
     </requestFiltering> 
    </security> 
    </system.webServer> 
0

Обратите внимание на readerQuotas на стороне клиента, если вы хотите, чтобы версия TLDR - чтобы убедиться, что это действительно ваша проблема, вы можете установить max (Int32.MaxValue), как показано ниже.

<readerQuotas maxDepth="2147483647" maxStringContentLength="2147483647" maxArrayLength="2147483647" maxBytesPerRead="2147483647" maxNameTableCharCount="2147483647" /> 
+1

Спасибо bnkdev за указание на это, попробовал, но это не исправляет :( –

Смежные вопросы