Странная ошибка WCF - IIS размещен - контекст прерван - PullRequest
1 голос
/ 17 июля 2009

У меня есть служба WCF, которая выполняет некоторые преобразования документов и возвращает документ вызывающей стороне. При локальной разработке на моем локальном сервере разработчика служба размещается на сервере разработки ASP.NET, консольное приложение вызывает операцию и выполняется в течение нескольких секунд.

Когда я размещаю службу в IIS через файл .svc, два документа работают правильно, третий вырывается, он начинает создавать документ Word с использованием OpenXml Sdk, но затем просто умирает. Я думаю, что это как-то связано с IIS, но я не могу указать на это.

Существует три типа документов, которые я генерирую. В двух словах, как это работает

SQL 2005 DB / IBM DB2 -> WCF Сервис, написанный другим разработчиком для предоставления данных. Эта служба имеет только одну конечную точку, использующую basicHttpBinding

Моя служба вызывает его службу, получает соответствующие данные, использует Open Xml Sdk для создания документа Microsoft Word, сохраняет его на сервере и возвращает путь пользователю.

Слово документов не превышает 100 КБ.

Я также использую basicHttpBinding, хотя я пробовал wsHttpBinding с теми же результатами.

Что удивительно, так это то, насколько быстро он работает локально, и даже более того, что два документа генерируются просто отлично, это третий тип документа, который отказывается работать.

К сообщению об ошибке:

Произошла ошибка при получении ответа HTTP на http://myservername.mydomain.inc/MyService/Service.Svc. Это может быть связано с тем, что привязка конечной точки службы не использует протокол HTTP. Это также может быть связано с тем, что сервер прерывает контекст HTTP-запроса (возможно, из-за выключения сервера). Более подробную информацию смотрите в журналах сервера.

Последние 2 дня я потратил, пытаясь выяснить, что происходит, я перепробовал все, в том числе изменил maxReceivedMessageSize, maxBufferSize, maxBufferPoolSize и т. Д. И т. Д. На большие значения, я даже включил:

 <httpRuntime maxRequestLength="2097151" executionTimeout="120"/>

Чтобы узнать, может быть, IIS задыхался из-за этого.

Программно служба не делает ничего особенного, она просто создает документы Word из данных, используя Open Xml Sdk, и, как я уже сказал, локально все 3 документа работают при вызове через консольное приложение, работающее локально на сервере asp.net dev, т.е. http://localhost:3332/myService.svc

Когда я размещаю его в IIS и пытаюсь заставить приложение Windows Forms вызвать его, я получаю сообщение об ошибке.

Я знаю, что вы будете запрашивать журналы, так что да, у меня включена регистрация на моем хосте.

А в логах нет ошибок , я все регистрирую.

Обычно я вызываю две сервисные операции, написанные другим разработчиком.

MyOperation вызывает -> HisOperation1, а затем HisOperation2, оба этих вызова дают мне сложные типы. Я собираюсь посмотреть на его код завтра, потому что он использует LINQ2SQL, и там может происходить какое-то забавное дело. Он использует множество коллекций и т. Д., Но тот факт, что я могу запускать один и тот же документ, позволяет называть его «Документ 3» в течение нескольких секунд, когда служба размещается локально на сервере ASP WebDev, - это самое странное, с чего бы это бежать по сокращенной Кассини и взорвать IIS?

Судя по журналу, после вызова HisOperation1 и HisOperation2 служба просто переходит в режим ожидания, в журнале событий Windows возникает ошибка пула приложений (w3wp.exe).

Faulting application w3wp.exe, version 6.0.3790.1830, stamp 42435be1, faulting module kernel32.dll, version 5.2.3790.3311, stamp 49c5225e, debug? 0, fault address 0x00015dfa.

Он классифицируется как ошибка .NET 2.0 Runtime.

Любая помощь приветствуется, мне не хватает сна.

Помоги мне, Оби-Ван Кеноби, ты моя единственная надежда.

Ответы [ 4 ]

1 голос
/ 05 сентября 2011

У меня появилось это сообщение:

Произошла ошибка при получении ответа HTTP на http://myservername.mydomain.inc/MyService/Service.Svc. Это может быть связано с тем, что привязка конечной точки службы не использует протокол HTTP. Это также может быть связано с тем, что сервер прерывает контекст HTTP-запроса (возможно, из-за выключения сервера). Подробнее смотрите в журналах сервера.

И проблема заключалась в том, что объект, который я пытался передать, не был [Сериализуемым]. Объект, который я пытался передать, был DataTable.

Я считаю, что текстовые документы, которые вы пытались передать, также не сериализуемы, поэтому это может быть проблемой.

0 голосов
/ 11 марта 2015

У меня была такая же ошибка при использовании IEnumerable<T> DataMember в моей службе WCF. Оказалось, что в некоторых случаях я возвращал IQueryable<T> как IEnumerable<T>, поэтому все, что мне нужно было сделать, это добавить .ToList<T>() к моим операторам LINQ.

Я изменил IEnumerable<T> на IList<T>, чтобы избежать повторения той же ошибки.

0 голосов
/ 17 июля 2009

Кстати, я изменил IIS 6 для работы в режиме изоляции IIS 5.0 и все работает. Странно.

0 голосов
/ 17 июля 2009

Да, нам нужны журналы или хотя бы какое-то представление о том, что вы регистрируете. Я предполагаю, что у вас есть и сообщение, и транспортный вход в систему на уровне WCF.

Одна вещь, на которую нужно обратить внимание - это разрешения. Когда вы работаете в Cassini, веб-сервер работает как текущий вошедший в систему пользователь. Это скрывает любые проблемы с разрешениями SQL или CAS (поскольку, честно говоря, ваша учетная запись обычно является локальным администратором). Как только вы публикуете в IIS, вы работаете под пользователем пула приложений, который по умолчанию намного более ограничен.

Попробуйте включить отладочные дампы IIS и выполните шаги, описанные в KB919789

...