Как добавить ссылку на веб-сервис в DLL - PullRequest
6 голосов
/ 12 февраля 2010

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

Например, у меня есть DLL с именем API.DLL, которая вызывает веб-сервис с именем WebService.svc, который я хочу использовать в проекте под названием WinForm.Во-первых, я должен добавить «Справочник по услугам» в WebService.svc в API.DLL.Затем я добавляю ссылку API.DLL в WinForm, но она не работает, если я также не добавляю ссылку на службу WebService.svc в WinForm.

Что я могу сделать, чтобы избежать этого последнего шага?

Ответы [ 4 ]

6 голосов
/ 19 февраля 2010

Ваш первый шаг - доказать себе, что это возможно, а затем адаптировать свой проект.

Вы можете загрузить готовое решение здесь .

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

    Create a web app project (an thus a solution) named 'ReferencedWebService'
    Add a web service, just leave the default name and implementation
    Add a class library named 'ReferencedWebserviceAPI'
        Add Service Reference
            >Advanced
                >Add Web Reference>Web services in this solution
                    >WebService1
                        >Add reference leaving name as 'localhost'
    Add a console application project named 'ReferencedWebserviceClient'    
    To ReferencedWebserviceClient: 
        Add Reference
            >Projects
                >ReferencedWebserviceAPI
        Add Reference
            >.Net
                >System.Web.Services

    In Program.cs replace Main:

    static void Main(string[] args)
    {
        var svc = new ReferencedWebserviceAPI.localhost.WebService1();
        var result = svc.HelloWorld();
        Console.WriteLine(result);
        Console.ReadLine();
    }


    Set ReferencedWebserviceClient as startup project and run.

    Ok, this is simplest scenario. One issue you will have to deal with is that the default Service URL is hardcoded in the .dll,
    and it is set to a ported address on your dev machine.

    You will want to add a configuration parameter to your client project. The simplest and most portable way is to use an appSetting.

    To ReferencedWebserviceClient:
        Add Item
            >Application Configuration File

    Replace contents of App.Config with this, of course replace the value with the appropriate value on your machine.

    
    
      
        
      
    


        Add Reference
            >.Net
                >System.Configuration

    Now replace Main with this:

    static void Main(string[] args)
    {
        var svc = new ReferencedWebserviceAPI.localhost.WebService1
                      {
                          Url = ConfigurationManager.AppSettings["serviceUrl"]
                      };
        var result = svc.HelloWorld();
        Console.WriteLine(result);
        Console.ReadLine();
    }

Это базовая линия для встраивания служб в распространяемый .dll.

Попробуйте применить эту модель к вашему текущему проекту и посмотрите, как это работает для вас.

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

Надеюсь, это поможет

5 голосов
/ 12 февраля 2010

Возможно, вы используете типы, предоставляемые веб-службой, или вам может понадобиться добавить веб-ссылку, чтобы в файл конфигурации была добавлена ​​соответствующая информация о соединении. Приложение winform никоим образом не наследует и не использует файл конфигурации DLL, если вы не подготовите для него какой-нибудь причудливый механизм загрузки. Другими словами, в DLL, когда вы добавляете веб-ссылку, ее конфигурационный файл получает информацию о том, как подключиться к веб-службе, но когда вы затем используете DLL в приложении, ваша прикладная программа нуждается в этой информации в своем собственном файле конфигурации, таким образом, вы должны добавить веб-ссылку, чтобы информация генерировалась.

Что касается использования типа, предоставляемого веб-ссылкой, я не уверен, что это может быть проблемой, с которой вы столкнулись. Я сталкивался с такими вещами в DLL. Например, SharpMap.dll объявляет класс SharpMapData, а WrapperOfSharpMap.dll имеет метод с именем ProcessData(SharpMapData blah)

Если я пишу приложение WinForm и добавляю ссылку на WrapperOfSharpMap.dll, я также должен добавить ссылку на SharpMap.dll, потому что для вызова ProcessData мне нужно создать экземпляр SharpMapData для передачи в функцию. Другими словами, я использую тип, объявленный в SharpMap.dll, поэтому мне нужна ссылка на него.

Чтобы решить эту проблему, создатель WrapperOfSharpMap.dll должен создать класс WrapperSharpMapData следующим образом:

class WrapperSharpMapData
{
  private SharpMapData hiddenSharpMapData;

  //create proprerties to access data elements using standard CLR types or other wrapper types
}
1 голос
/ 19 февраля 2010

Вы можете попробовать поискать svcutil.exe , который позволяет вам генерировать прокси-код на стороне клиента для вашего сервиса через командную строку. Вы должны быть в состоянии взять файл кода, который он создает, и просто добавить его в свой проект DLL. Это позволяет полностью обойти Visual Studio.

1 голос
/ 12 февраля 2010

Это потому, что вам нужна ссылка на службу, чтобы приложение WinForm могло ссылаться на типы, возвращаемые вашей службой?

Если это так, вы можете превратить свою dll API в оболочку для службы и обернуть все методы, доступные в службе в API, и сделать то же самое для объектов (при условии, что они являются предложениями, которые вы создали ). Очевидно, вам придется преобразовать все объекты, которые служба возвращает в объекты в API. Но как только это будет сделано, вам не нужно ссылаться на сервис в WinForm. (как ни странно, я сам собираюсь сделать что-то подобное!).

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