Не удается получить доступ к методам SOAP при использовании библиотеки классов - PullRequest
0 голосов
/ 30 октября 2009

У меня проблемы с доступом к методам в моей библиотеке классов WCF, и мне интересно, может кто-нибудь объяснить, почему?

У меня есть веб-проект, который имеет один файл DLL - WebAPILibrary.DLL в своей папке / bin. Файлы SVC на моем веб-сайте указывают на соответствующие контракты, содержащиеся в файле DLL. Так, например, под пространством имен WebProject.WebAPI.Auth у меня есть:

   [DataContract]
    public class Auth
    {
        [DataMember]
        public string LoginUser;
    }


    [ServiceBehavior]
    public class AuthService : IAuthService
    {

     string IAuthService.LoginUser(string Email, string Password)
     {
            //do some stuff
     }

     }


    [ServiceContract(Namespace="WebAPI.Authentication")]
    public interface IAuthService
    {

        [OperationContract(Name = "LoginUser")]
        string LoginUser(string Email, string Password);

    }

Теперь, когда я создаю экземпляр AuthService auth = new AuthService () в моем веб-проекте, я ожидаю, что auth.LoginUser (string Email, string Password), но auth не предоставляет ни один из моих определенных методов. В качестве теста я создал экземпляр IAuthService и получил то, что хотел. Поскольку IAuthService реализован AuthService, разве я не смогу сделать то же самое, создав экземпляр AuthService?

Кроме того, когда я указываю URL любого из моих файлов SVC, они загружаются, как и ожидалось.

Спасибо за ваше время.

Ответы [ 3 ]

1 голос
/ 30 октября 2009

Когда вы «создаете экземпляр» IAuthService - возможно, посредством создания клиентского прокси для этого контракта на обслуживание - вы видите представление контракта на обслуживание класса, например, вы видите все, что выставлено на [ServiceContract] как [OperationContract] - методы обслуживания. Это то, что раскрывается в описании вашего сервиса (WSDL вашего сервиса), и совершенно неважно, какую видимость эти методы имеют в мире .NET.

Однако, если вы создаете экземпляр класса службы напрямую как класс .NET (а не через среду выполнения службы WCF), то, очевидно, вы ограничены ограничениями видимости .NET, и члены класса internal по умолчанию, например снаружи не видно.

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

Марк

ОБНОВЛЕНИЕ: если вы хотите использовать вашу DLL "в качестве службы WCF", вам необходимо использовать прокси-клиент WCF, чтобы использовать ее. Это можно сделать несколькими способами:

  • создать клиентский прокси, используя svcutil.exe из командной строки
  • в Visual Studio, используйте «Add Service Reference» и позвольте VS создать ваш клиентский прокси для вас
  • или создайте клиентский прокси в коде - на самом деле это не так сложно!

В коде вы можете сделать что-то вроде

ChannelFactory<IAuthService> factory = new ChannelFactory<IAuthService>();

IAuthService proxy = factory.CreateChannel();

Теперь в вашем proxy классе вы должны увидеть и уметь использовать ваш Login метод.

Конечно, чтобы все работало, вам понадобится правильный набор записей конфигурации и все в вашем web.config.

Это помогает?

0 голосов
/ 30 октября 2009

Вы можете слегка изменить свой код следующим образом

[ServiceBehavior]
public class AuthService : IAuthService
{    
 public string IAuthService.LoginUser(string Email, string Password)
 {
        //do some stuff
 }    
}

В своем коде вы реализовали интерфейс явно, не делая модификатор доступа общедоступным, поэтому метод LoginUser виден только тогда, когда тип объявления переменной является конкретным интерфейсом. Это полезно, когда вы реализуете разные интерфейсы с одним и тем же определением элемента.

public interface ITest1
{
 void Hello();
}

public interface ITest2
{
 void Hello();
}

Явное значение

public class Impl : ITest1, ITest2
{
   void ITest1.Hello(){ ... }
   void ITest2.Hello(){ ... }
}

ITest1 obj1 = new Impl();
obj1.Hello() // this is calling ITest1.Hello()

ITest2 obj2 = new Impl();
obj2.Hello() // this is calling ITest2.Hello()

Или Неявный impl , для которого нужен только один член.

public class Impl : ITest1, ITest2
{
   public void Hello(){ ... }
}
0 голосов
/ 30 октября 2009

Вы должны поставить "public" перед "строкой IAuthService.LoginUser (string Email, string Password)" в вашей реализации, поэтому она должна быть

public string IAuthService.LoginUser(string Email, string Password)
{
    // do some stuff
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...