0

为了避免 Web 服务无法传递复杂对象(如字典和树)的问题,我在类中创建了一个带有一些值字段的小结构。但是,Web 服务位于解决方案中的一个单独项目中,我不确定调用 webService 函数的背后代码如何知道结构是什么。我应该将结构复制到后面的代码文件吗?我可以导入吗?

这是一个小例子:

namespace mYWebService{

 [WebService(Namespace = "http://tempuri.org/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
[ScriptService]
public class Service1 : System.Web.Services.WebService
{
  struct TreeData
    {
    private readonly string text;
    private readonly string parent;
    private string val;

    public TreeData (string Text, string Parent)
    {
        this.text = Text;
        this.parent = Parent;
        this.val = "";
    }

         public TreeData (string Text, string Parent, string Value)
    {
        this.text = Text;
        this.parent = Parent;
        this.val = Value;
    }


    public string Text { get { return text; } }
    public string Parent { get { return parent; } }
    public string Value { get { return val; } }

}


[WebMethod]`
 public TreeData getTree(){
      TreeData myTree = new TreeData("1","2","3");
       return myTree;
 }}
4

2 回答 2

0

当您在客户端代码中生成绑定时,所有必要的复杂数据类型都将自动创建,因为它们在服务的元数据中进行了描述。但是,如果没有硬性要求使用老式的 .NET 2.0 Web 服务(即类),您现在应该使用WCF 。WebService

于 2013-08-28T20:56:35.260 回答
0

您将很难编译它,因为您在公共方法中公开了一个私有结构。至少,该结构必须公开。我还建议您将结构放在类之外,因为内部类 / 结构 /etc 是不好的做法(这是我个人的观点,但是您看不到它们在例如 .net 框架中的使用频率很高,这表明 Microsoft 没有也不喜欢他们)。

请记住,Web 服务是自然分布的,因此您不必直接依赖对类的引用。这是一个 SOAP 服务(我认为),框架会暴露服务的元数据。Visual Studio 可以使用此元数据自动生成可用于调用服务的代理客户端。

这是设置代理的简单方法:

  1. 启动 Web 服务项目可执行文件(不在调试模式下,您仍需要能够使用 Visual Studio 进行后续步骤)
  2. 选择你的web服务客户端(调用服务的代码)所在的项目,添加服务引用
  3. 这将打开一个对话框,您可以在其中输入服务端点 (url)。输入运行服务的端点,您应该可以在此对话框中选择
  4. 添加引用后,应为您生成一些自动生成的代理代码。这将使您可以访问您的方法。

最后,我同意 Ondrej Tucny 的观点,即您应该研究 WCF

于 2013-08-28T20:59:52.300 回答