我在访问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时,它们会按预期加载。
感谢您的时间。
答案 0 :(得分:1)
当您“实例化”IAuthService时 - 可能是通过为该服务合同创建客户端代理 - 您会看到该类的服务合同视图,例如你会看到[ServiceContract]
作为[OperationContract]
公开的所有内容 - 服务方法。这是在您的服务描述(服务的WSDL)中公开的内容,而这些方法在.NET世界中的可见性完全无关紧要。
但是,如果直接将服务类实例化为.NET类(而不是通过WCF服务运行时),那么显然,您受到.NET可见性约束的限制,并且类的成员是{{1默认情况下,例如外面看不到。
所以基本上,你需要区分你是将你的类视为WCF服务契约的表示,还是作为经典的.NET类。
马克
更新:如果您想将您的DLL“用作WCF服务”,则需要使用WCF客户端代理方式才能使用它。这可以通过以下几种方式完成:
internal
创建客户端代理在代码中,您可以执行类似
的操作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(){ ... }
}