【问题标题】:How to use automatically generated proxy class?如何使用自动生成的代理类?
【发布时间】:2013-12-06 22:00:59
【问题描述】:

我想使用数据库中的网络服务来收集信息。现在,我实现了 Web 服务,通过 wsdl.exe 把它变成了一个代理类,但我对结果有点恼火。调用该类的正常方式是新对象 -> 方法 -> 参数 -> 幸福。这个东西只包含部分类并且需要奇怪的参数。我什至不确定我是否有正确的方法来获取想要的信息。

这似乎是需要的方法:

public UniProtId2DomainIdsRecordType[] UniProtId2DomainIds   (UniProtId2DomainIdsRequestRecordType UniProtId2DomainIdsRequestRecord)
{
    object[] results = this.Invoke("UniProtId2DomainIds", new object[] {
                UniProtId2DomainIdsRequestRecord});
    return ((UniProtId2DomainIdsRecordType[])(results[0]));
}

这似乎是需要的类之一:

public partial class UniProtId2DomainIdsRequestRecordType

{

private string uniprot_accField;

/// <remarks/>
public string uniprot_acc
{
    get
    {
        return this.uniprot_accField;
    }
    set
    {
        this.uniprot_accField = value;
    }
}

}

(这是整个类,由wsdl.exe生成->https://www.dropbox.com/s/yg909ibdq02js5a/GetCath.cs

但是一旦我尝试使用它,我认为它应该可以工作......好吧......我对此的实验(没有一个工作):

            UniProtId2DomainIdsRequestRecordType Uni2Cath = new UniProtId2DomainIdsRequestRecordType();
        Uni2Cath.uniprot_acc = "P0A7N9";
        UniProtId2DomainIdsRecordType[] UniProtId2DomainIds;
        UniProtId2DomainIdsRecordType test = new UniProtId2DomainIdsRecordType();
        test.uniprot_acc = "P0A7N9";
        UniProtId2DomainIdsRecordType[] UniProtId2DomainIds(test);

我只需要获取一个像 P0A7N9 这样的字符串来传递给服务器。

(对该网络服务的引用:http://api.cathdb.info/api/soap/dataservices/wsdl#op.o159501052

谁能告诉我如何处理这个问题,好吗?

【问题讨论】:

  • ASMX 是一项遗留技术,不应用于新开发。 WCF 或 ASP.NET Web API 应该用于 Web 服务客户端和服务器的所有新开发。一个提示:Microsoft 已停用 MSDN 上的 ASMX Forum
  • 很高兴提及,但这并没有改变我需要使用的数据库具有它们的格式这一事实。顺便说一句,我从来没有提到过使用 ASMX,我也没有将它添加到标签中。我不在 asp.net 中编码,它是纯 C# 并且所寻址的服务是 SOAP over HTTP。
  • WSDL.EXE 是 ASMX 技术的一部分。

标签: c# soap wsdl asmx proxy-classes


【解决方案1】:

最简单的方法是将此 Web 服务作为 Service Reference 添加到您的项目中。然后你可以调用不同的方法。使用这个作为地址:http://api.cathdb.info/api/soap/dataservices/wsdl

using (var ser = new DataServicesPortTypeClient())
{
    var results = ser.UniProtId2DomainIds(new UniProtId2DomainIdsRequestRecordType
    {
        uniprot_acc = "P0A7N9"
    });

    if (results != null)
    {
        var geneName = results.gene_name;
        var speciesName = results.species_name;
    }
}

如果您想使用生成的类,请执行以下操作:

using (var service = new DataServices())
{
    var results = service.UniProtId2DomainIds(new UniProtId2DomainIdsRequestRecordType
    {
        uniprot_acc = "P0A7N9"
    });

    if (results != null && results.Length >0)
    {
        var geneName = results[0].gene_name;
        var speciesName = results[0].species_name;
    }
}

正如 John 在 cmets 中所建议的,ASMX 和 wsdl.exe 是已弃用的技术。您应该使用服务参考和svcutil.exe

【讨论】:

  • 这可能有效,但我如何获得答案?它是一个由六个字符串组成的数组。而且我真的很想知道如何使用生成的类,以防我想使用除 uniprot 之外的其他方法来引导。
  • 我用一些想法更新了答案。生成的 Web Reference 具有服务公开的所有方法,您将能够使用它们。 Web Reference 生成与 wsdl.exe 相同的类,只是更好,因为您让 VS 处理它,而不是命令行。
  • -1 用于建议 Web 引用而不是服务引用。
  • 服务参考更有意义。出于某种原因,我认为这是 ASMX 服务。即将更新。
  • 实现了下面的代码,它运行良好。感谢你付出的努力。 :)
猜你喜欢
  • 2016-04-14
  • 1970-01-01
  • 1970-01-01
  • 2014-06-25
  • 2014-04-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-18
  • 2010-09-30
相关资源
最近更新 更多