Создание веб-службы без файла ASMX? - PullRequest
6 голосов
/ 27 ноября 2008

Я написал составной элемент управления ASP.NET, который включает в себя некоторый Javascript, который взаимодействует с веб-сервисом.

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

Проблема, с которой я столкнулся, заключается в том, что, помимо ссылки на DLL в своем проекте, потребитель моего элемента управления также должен включать файл .ASMX для веб-службы. Хотя это не сложный файл (просто однострочный, который ссылается на класс в DLL), я бы хотел, чтобы его не было, если смогу.

Есть ли способ избежать наличия файла .ASMX?

  • Могу ли я зарегистрировать сервис на веб-сервере в Application_Start?
  • Можно ли как-нибудь изменить web.config, чтобы ссылаться на него?

Все предложения с благодарностью приняты!

ОБНОВЛЕНИЕ: Статья, ссылка на которую содержится в ответе Джона Шихана (ниже), работает, но не в том случае, если вы хотите вызвать веб-службу с использованием AJAX. Кто-нибудь знает о дружественной версии AJAX?

Ответы [ 5 ]

5 голосов
/ 27 ноября 2008

Попробуйте что-нибудь подобное. Я не знаю, будет ли это работать, хотя. Я получил эту идею от ELMAH, которая создает обработчик для страницы, которая физически не существует, а затем подает ее из сборки.

<configuration>
   <system.web>
      <httpHandlers>
         <add verb="*" path="*WebService.asmx" type="MyHandler.WebServiceHandler, MyHandler" />
      </httpHandlers>
   </system.web>
</configuration>

РЕДАКТИРОВАТЬ: Я был близок, см. Эту статью (хотя в VB): http://www.codeproject.com/KB/aspnet/wsinaclasslibrary.aspx

3 голосов
/ 05 января 2010

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

Каждый запрос * .ASMX по умолчанию обрабатывается System.Web.Services.Protocols.WebServiceHandlerFactory.

Изучая исходный код этого класса в рефлекторе .NET, можно получить веб-сервис без файла ASMX, но вам потребуется вызвать внутренний метод CoreGetHandler через рефлексию.

Следующий метод возьмет ваш веб-сервис и вернет его IHttpHandler.

public IHttpHandler GetHttpHandlerForWebService(WebService webService, HttpContext context)
{
    var webServiceType = webService.GetType();
    var wshf = new System.Web.Services.Protocols.WebServiceHandlerFactory();
    var coreGetHandler = wshf.GetType().GetMethod("CoreGetHandler");
    var httpHandler = (IHttpHandler)coreGetHandler.Invoke(wshf, new object[] { webServiceType, context, context.Request, context.Response });
    return httpHandler;
}

Как только вы получите httphandler, просто позвоните

httpHandler.ProcessRequest (контекст)

Готово. Нет записей ASMX и web.config.

2 голосов
/ 09 октября 2012

Вот очень хорошая рабочая статья о вашей проблеме:

Создание веб-служб в проекте библиотеки классов в Codeproject.

0 голосов
/ 28 ноября 2008

Попробуйте попробовать методы страницы ( см. Этот блог ). Все, что вам нужно сделать, это добавить атрибут веб-метода к статическому методу в коде aspx. Затем получите доступ к объекту PageMethod из вашего клиентского кода (javascript). Файлы ASMX не нужны. Надеюсь, это поможет.

0 голосов
/ 27 ноября 2008

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

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