Skip to main content
 首页 » 编程设计

c#之我可以创建具有属性的 Web 服务吗

2024年02月03日33mayingbao

我正在尝试围绕尚不可用的 Web 服务测试代码。我正在尝试模拟我自己的版本。根据规范,它将这样调用。

var service = new Service(); 
service.SD = new ServiceData(); 
service.SD.ID = "ABC123"; 
service.SD.Auth = "00000"; 
string result = service.DoMyThing(); 

这是我得到的最接近的。

var service = new Service(); 
service.set_SD(new ServiceData()); 
service.get_SD().ID = "ABC123"; 
service.get_SD().Auth = "00000"; 
service.DoMyThing(); 

问题出在 SD 属性上。如何编写服务以便 Visual Studio 2008 正确生成 Web 引用?

这是我当前的虚拟网络服务代码。

public class Service : System.Web.Services.WebService 
{ 
    // This doesn't show up in the generated proxy at all 
    public static ServiceData SDTest; 
 
    // For extra credit explain why this needs to be static for it to work 
    private static ServiceData _sd; 
    public ServiceData SD 
    { 
        [WebMethod(EnableSession = true)] 
        get { return _sd; } 
        [WebMethod(EnableSession = true)] 
        set { _sd = value; } 
    } 
 
    [WebMethod] 
    public string DoMyThing() 
    { 
        // Presumably the real service accesses SD in here 
        return ""; 
    } 
} 
 
public class ServiceData 
{ 
    public string ID { get; set; } 
    public string Auth { get; set; } 
} 

请您参考如下方法:

您的设计有缺陷。 Web 服务并不意味着具有属性。它们应该只公开方法,原因是 HTTP 协议(protocol)是无状态的(Web 服务也假设了这一点),所以公开一个属性没有意义,除非你希望它应用于实例的所有调用者(并且仍然,甚至在那种情况下,暴露它是没有意义的)。

相反,您想要做的是让 DoMyThing 方法获取 ServiceData 的实例(如果需要)并对其进行操作,返回适当的结果集。

如果您确实需要公开服务的属性,您可以使用 GetProperties 方法(或类似方法),它不带参数并返回包含服务信息的适当数据结构。