Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/257.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何强制WebService引用实现公共接口?_C#_Asp.net_Web Services - Fatal编程技术网

C# 如何强制WebService引用实现公共接口?

C# 如何强制WebService引用实现公共接口?,c#,asp.net,web-services,C#,Asp.net,Web Services,我正在使用.net web服务创建一个研究项目,遇到了以下问题: 为了提供更改web服务器甚至其性质(这是任务的一部分)的机会,我在一个单独的.dll中创建了一个接口,每个可能的(web)服务都必须实现该接口。说 public interface IDataAccess { // Group of methods which are used for login/logout bool isUserRegistered(string username); bool aut

我正在使用.net web服务创建一个研究项目,遇到了以下问题: 为了提供更改web服务器甚至其性质(这是任务的一部分)的机会,我在一个单独的.dll中创建了一个接口,每个可能的(web)服务都必须实现该接口。说

public interface IDataAccess
{
    // Group of methods which are used for login/logout
    bool isUserRegistered(string username);
    bool authorize(string username, string password);
    //...
}
我让web服务实现这个接口:

[WebService(Namespace = "http://tempuri.org/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
[System.ComponentModel.ToolboxItem(false)]
public class Server : System.Web.Services.WebService, IDataAccess
{
    //...
}
然后,在客户端中,我创建对此服务的引用(命名空间WebReference),指定在所有程序集中重用类型,并尝试执行以下操作:

private IDataAccess webService = (IDataAccess)(new WebReference.Server());
但此分配在运行时引发异常,说明转换无法完成,并且在Reference.cs(这是通过向Web服务添加引用创建的内容的一部分)中,有一个服务器类的重新声明,该类未声明IDataAccessImplementation:

public partial class Server : System.Web.Services.Protocols.SoapHttpClientProtocol {
    //...
}

因此,我的问题是,如何使该引用实现公共接口IDataAccess,而无需手动编辑文件reference.cs?

首先,您确实不需要在服务器端实现该接口-这对生成的代码没有任何作用

接下来,请注意声明是一个分部类。您可以利用它

您只需创建另一个C#文件,该文件具有:

public partial class Server : SoapHttpClientProtocol, IDataAccess {}
这就是您所需要的(在正确的名称空间中,使用正确的
指令)。无代码-生成的类中提供了所有这些。C#编译器将混合这两个声明,然后您可以使用:

private IDataAccess webService = new WebReference.Server();

…或者更好的方法是,通过构造函数将其注入,这样您就可以编写完全不需要使用实际实现的测试!

ASMX是一种遗留技术,不应用于新的开发。WCF应用于所有web服务客户端和服务器的新开发。提示:Microsoft已退出MSDN上的测试。“您真的不需要在服务器端实现接口——这对生成的代码没有任何作用"-那么,我如何确保所有web服务都能执行所需的方法集呢?@Dmitry:如果它们不执行,那么客户端生成的代码将无法正确实现接口…所以你可以这么说。让服务器端也实现接口也没有坏处-我只是说它不会影响生成的c颂歌。