Как мне сослаться на файл в приложении веб-сервиса WCF? - PullRequest
0 голосов
/ 27 января 2012

Я работал над несколькими C # проектами на протяжении многих лет, и в целом правила согласованы от типа проекта к типу проекта. Но, начав проект веб-сервиса WCF, я нахожу вещи несколько иными. Я должен проверить входящий XML в схему. Я создал папку из корня проекта, XSD, для хранения схем. В предыдущих проектах при обращении к XSD в папке я использовал что-то вроде этого:

            XmlTextReader textReader = null;
            XmlSchemaCollection xSchemaCollection = null;
            XmlValidatingReader valReader = null;

            string uri = string.Format(@"{0}\{1}", Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location), XSDPath);

            //  text reader object
            textReader = new XmlTextReader(uri);
            xSchemaCollection = new XmlSchemaCollection();
            xSchemaCollection.Add(null, textReader);

            //  XML validator object
            valReader = new XmlValidatingReader(strXMLDoc, XmlNodeType.Document, null);

Для свойств файлов XSD установлено значение «Всегда копировать в целевую папку». Обычно я получаю правильный путь к XSD, и все идет хорошо. Но в этом проекте WCF Webservice путь, в который копируются файлы XSD, является временным каталогом, и я не могу получить правильный путь. Сбой метода xSchemaCollection.Add.

Кстати, папка XSD в данный момент отсутствует в проекте WCF. Я добавил проект библиотеки классов (в котором в настоящее время находится вышеупомянутый код), и там находятся папка и файлы. Я ожидал, что это устранит проблему с временным каталогом, но это не так.

Есть идеи, что я делаю не так? Заранее спасибо.

Ответы [ 2 ]

0 голосов
/ 27 января 2012

Я думаю, что если по какой-то причине у вас возникнет проблема с доступом к XSD через файловую систему, то я бы, скорее всего, внедрил их как ресурсы в сборку.Все, что вам нужно сделать, - это использовать собственный распознаватель (судя по всему, эти XSD, похоже, не используют include / import; это действительно так, пользовательский распознаватель, безусловно, подходит) ...

0 голосов
/ 27 января 2012

WCF - это очень мощная структура, но одна из основных концепций WCF заключается в том, что определение сервиса абстрагируется от деталей реализации канала связи.Это означает, что служба WCF не знает, какие XSD-файлы используются для описания своего содержимого, или даже если XSD-файлы используются вообще (привязка службы не обязательно использует SOAP).

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

Если вы обнаружите, что должны обрабатывать сообщения SOAP напрямую нестандартным способом, WCF может оказаться не лучшим инструментомдля работы.Я бы порекомендовал вам рассмотреть возможность использования других стратегий реализации сервисов, таких как HttpHandler или старый добрый asmx-файл.Веб-сервисы на основе Asmx далеко не такие сложные, как WCF, но именно эта нехватка делает их более гибкими для нестандартных протоколов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...