2

有没有办法在创建 Web 服务时指定要使用的类型?具体来说,我希望能够在客户端和服务器上使用相同的类型,以减少代码重复。

过度简化的例子:

    public class Name
    {
        public string FirstName {get; set;}
        public string Surname { get; set; }

        public override string ToString()
        {
            return string.Concat(FirstName, " ", Surname);
        }
    }

我不想在我的课堂上重新编码一些功能。另一件事是存在的任何操纵此类的代码都不会在客户端工作,因为生成的客户端类将是不同的类型。

4

2 回答 2

3

好的,我知道这是 SOAP 的明确设计决定,因此您实际上不应该这样做。我发现以下页面解释了原因:

服务共享模式和契约,而不是类。服务仅在其通过模式的结构表达和通过合同的行为上进行交互。该服务的契约描述了消息的结构和消息的排序约束。表达式的形式允许对传入消息进行机器验证。传入消息的机器验证允许您保护服务的完整性。合同和模式必须随着时间的推移保持稳定,因此灵活地构建它们很重要。

话虽如此,还有另外两种可能:

  1. 在 Visual Studio 中或使用 wsdl.exe 生成 Web 引用。然后进入生成的 Reference.cs(或 .vb)文件并显式删除类型。然后重定向到您想要位于另一个程序集中的类型。
  2. 您可以通过 wsdl.exe 和 /sharetypes 参数在客户端的 Web 服务之间共享类型。
于 2008-09-27T06:26:50.790 回答
0

如果您想在您的 Web 服务和您的客户端之间共享一个类型或结构,请向您的 Web 服务项目添加一个公共结构,如下所示:

public struct Whatever
{
    public string A;
    public int B;
}

然后向您的 Web 服务添加一个方法,该方法具有此结构作为其返回类型:

[WebMethod]
public Whatever GiveMeWhatever()
{
    Whatever what = new Whatever();
    what.A = "A";
    what.B = 42;
    return what;
}

更新客户端的 Web 引用后,您将能够在客户端应用程序中创建类型为“Whatever”的结构,如下所示:

Webreference.Whatever what = new Webreference.Whatever();
what.A = "that works?";
what.B = -1; // FILENOTFOUND

这种技术使您可以维护需要在一个地方(Web 服务项目)来回传递的任何结构的定义。

于 2008-09-24T15:34:42.117 回答