使用类库时无法访问SOAP方法

时间:2009-10-29 21:06:15

标签: wcf web-services soap

我在访问WCF类库中的方法时遇到问题,并且想知道是否有人可以解释原因?

我有一个Web项目,它的/ bin文件夹中有一个DLL文件--WebAPILibrary.DLL。 我的网站中的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);

    }

现在,当我在我的web项目中实例化AuthService auth = new AuthService()时,我希望auth.LoginUser(字符串Email,字符串密码),但auth不会公开我定义的任何方法。作为测试,我实例化了IAuthService并获得了我想要的东西。由于IAuthService是由AuthService实现的,我不应该通过实例化AuthService来做同样的事情吗?

此外,当我指向任何SVC文件的URL时,它们会按预期加载。

感谢您的时间。

3 个答案:

答案 0 :(得分:1)

当您“实例化”IAuthService时 - 可能是通过为该服务合同创建客户端代理 - 您会看到该类的服务合同视图,例如你会看到[ServiceContract]作为[OperationContract]公开的所有内容 - 服务方法。这是在您的服务描述(服务的WSDL)中公开的内容,而这些方法在.NET世界中的可见性完全无关紧要。

但是,如果直接将服务类实例化为.NET类(而不是通过WCF服务运行时),那么显然,您受到.NET可见性约束的限制,并且类的成员是{{1默认情况下,例如外面看不到。

所以基本上,你需要区分你是将你的类视为WCF服务契约的表示,还是作为经典的.NET类。

马克

更新:如果您想将您的DLL“用作WCF服务”,则需要使用WCF客户端代理方式才能使用它。这可以通过以下几种方式完成:

  • 使用命令行中的internal创建客户端代理
  • 在Visual Studio中,使用“添加服务引用”并让VS为您创建客户端代理
  • 或者自己在代码中创建客户端代理 - 真的很难做到!

在代码中,您可以执行类似

的操作
svcutil.exe

现在,在ChannelFactory<IAuthService> factory = new ChannelFactory<IAuthService>(); IAuthService proxy = factory.CreateChannel(); 课程中,您应该看到并能够使用proxy方法。

当然,为了完成所有工作,您需要在web.config中使用正确的配置条目集。

这有帮助吗?

答案 1 :(得分:0)

你应该在你的实现中将“public”放在“string IAuthService.LoginUser(string Email,string Password)”的前面,所以它应该是

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

答案 2 :(得分:0)

您可以稍微修改以下代码

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

在您的代码中,您已明确实现了接口而未将访问修饰符设置为public,因此仅当变量的声明类型是特定接口时,LoginUser方法才可见。 当您使用相同的成员定义实现不同的接口时,这非常有用。

public interface ITest1
{
 void Hello();
}

public interface ITest2
{
 void Hello();
}

明确的Impl

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(){ ... }
}