Динамический веб-сервис C#.NET

Для пользователей Linux / Ubuntu, которые запускают Eclipse из модуля запуска (файл .desktop), который заблокирован для вашего модуля запуска, а в диалоговом окне «Справка -> О программе» не отображается lombok:

  1. Закрыть Eclipse
  2. Разблокировать Eclipse с помощью панели запуска
  3. Запустить Eclipse из приложения .desktop
  4. Убедитесь, что «Справка -> О программе» указывает, что установлен lombok (прокрутите вниз )
  5. Снова заблокируйте ваш лаунчер

Кажется, это работает из-за некоторой проблемы с приложениями «lock to launcher», и это процесс разблокировки / блокировки, который исправляет это.

(Благодаря комментарию кардамона здесь , который указал мне на это решение)

7
задан Fritz H 30 May 2009 в 22:17
поделиться

5 ответов

WSDL можно изменить с помощью класса SoapExtensionReflector . Из Блог Кирка Эванса :

SoapExtensionReflector вызывается, когда ваш тип отражается, чтобы предоставить определение WSDL для вашей службы. Вы можете использовать этот тип, чтобы перехватить вызов отражения и изменить вывод WSDL.

В следующем примере удаляется первый метод из 2 методов веб-службы:

[WebService(Namespace = "http://tempuri.org/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
[System.ComponentModel.ToolboxItem(false)]
public class Service1 : System.Web.Services.WebService
{
   [WebMethod]
   public string HelloWorld()
   {
      return "Hello World";
   }

   [WebMethod]
   public int Multiply(int a, int b)
   {
      return a * b;
   }
}

Создайте класс, унаследованный от SoapExtensionReflector:

namespace TestWebservice
{
   public class MyReflector : SoapExtensionReflector
   {
      public override void ReflectMethod()
      {
         //no-op
      }

      public override void ReflectDescription()
      {
         ServiceDescription description = ReflectionContext.ServiceDescription;
         if (description.PortTypes[0].Operations.Count == 2)
            description.PortTypes[0].Operations.RemoveAt(0);
         if (description.Messages.Count == 4)
         {
            description.Messages.RemoveAt(0);
            description.Messages.RemoveAt(0);
         }
         foreach (Binding binding in description.Bindings)
         {
            if (binding.Operations.Count == 2)
               binding.Operations.RemoveAt(0);
         }
         if (description.Types.Schemas[0].Items.Count == 4)
         {
            description.Types.Schemas[0].Items.RemoveAt(0);
            description.Types.Schemas[0].Items.RemoveAt(0);
         }
      }
   }
}

Добавьте это в раздел config / system.web в web.config:

<webServices>
   <soapExtensionReflectorTypes>
      <add type="TestWebservice.MyReflector, TestWebservice" />
   </soapExtensionReflectorTypes>
</webServices>

Это должно дать вам отправную точку для динамического удаления методов из документа WSDL. Вам также потребуется выбросить NotImplementedException из веб-метода, если он отключен.

Наконец, необходимо отключить документацию веб-службы, создаваемую путем вызова конечной точки .asmx без параметра? WSDL. Установите атрибут href элемента wsdlHelpGenerator на некоторый URL. Вы можете использовать DefaultWsdlHelpGenerator.aspx в качестве отправной точки для вашего собственного обработчика документации. См. Вопрос о документации веб-служб в XML-файлах, август 2002 г. .

<webServices>
   <soapExtensionReflectorTypes>
      <add type="TestWebservice.MyReflector, TestWebservice" />
   </soapExtensionReflectorTypes>
</webServices>

Это должно дать вам отправную точку для динамического удаления методов из документа WSDL. Вам также потребуется выбросить NotImplementedException из веб-метода, если он отключен.

Наконец, необходимо отключить документацию веб-службы, создаваемую путем вызова конечной точки .asmx без параметра? WSDL. Установите атрибут href элемента wsdlHelpGenerator на некоторый URL. Вы можете использовать DefaultWsdlHelpGenerator.aspx в качестве отправной точки для вашего собственного обработчика документации. См. Вопрос о документации веб-служб в XML-файлах, август 2002 г. .

<webServices>
   <soapExtensionReflectorTypes>
      <add type="TestWebservice.MyReflector, TestWebservice" />
   </soapExtensionReflectorTypes>
</webServices>

Это должно дать вам отправную точку для динамического удаления методов из документа WSDL. Вам также потребуется выбросить NotImplementedException из веб-метода, если он отключен.

Наконец, необходимо отключить документацию веб-службы, создаваемую путем вызова конечной точки .asmx без параметра? WSDL. Установите атрибут href элемента wsdlHelpGenerator на некоторый URL. Вы можете использовать DefaultWsdlHelpGenerator.aspx в качестве отправной точки для вашего собственного обработчика документации. См. Вопрос о документации веб-служб в XML-файлах, август 2002 г. .

Установите атрибут href элемента wsdlHelpGenerator на некоторый URL. Вы можете использовать DefaultWsdlHelpGenerator.aspx в качестве отправной точки для вашего собственного обработчика документации. См. Вопрос о документации веб-служб в XML-файлах, август 2002 г. .

Установите атрибут href элемента wsdlHelpGenerator на некоторый URL. Вы можете использовать DefaultWsdlHelpGenerator.aspx в качестве отправной точки для вашего собственного обработчика документации. См. Вопрос о документации веб-служб в XML-файлах, август 2002 г. .

5
ответ дан 7 December 2019 в 01:25
поделиться

XMLRPC довольно мертв, не так ли?

SOAP подразумевает WSDL. Как вы генерируете WSDL динамически?

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

2
ответ дан 7 December 2019 в 01:25
поделиться

Должен ли быть интерфейс SOAP? Похоже, это может быть более подходящим для API на основе маршрута / REST / и т. Д. Вы можете сделать что-то в ASP.NET MVC (с помощью специального метода IController.Execute , который разрешает действие метода) довольно легко (на самом деле, я работаю над чем-то очень похожим для некоторых моего собственного кода на данный момент).

Например, у вас могут быть маршруты:

http://myserver/myservice/mymethod

, которые принимают (в теле или в аргументах) полезную нагрузку (параметры) и возвращают результат в ответе. Вне-MVC вы должны иметь возможность делать что-то подобное с помощью универсального обработчика с отображением подстановочных знаков.

1
ответ дан 7 December 2019 в 01:25
поделиться

Вы можете создать службу WCF с типом ввода и вывода xs: any и обрабатывать входящий запрос как необработанное сообщение . Это позволит вам принимать данные любого типа и возвращать данные любого типа. Вы не должны использовать контракты данных или статические типы, только сообщение на входе и сообщение на выходе.

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

2
ответ дан 7 December 2019 в 01:25
поделиться

Вот предложение:

  • Используйте WCF.
  • Создайте WSDL из WCF, используя информация в следующем блоге сообщение:

    http://www.pluralsight.com/community/blogs/kirillg/archive/2006/06/18/28380.aspx

  • Затем вы можете опубликовать эту информацию с использованием MEX.

  • После этого службы будут открыты для вашего клиенты для загрузки метаданных и вызовите сервисную службу.

0
ответ дан 7 December 2019 в 01:25
поделиться
Другие вопросы по тегам:

Похожие вопросы: