C# 如何 get/set 来自 asmx Web 服务的数据

C# How to get/set data from asmx Web Service

我正在使用 VisualStudio2013。重要的是读者要注意,这个 asmx 派生自的代码可以完美地工作,但我不知道如何使用 asmx WebService。我从这里下载了整个九码https://sourceforge.net/projects/shorturl-dotnet/

我不知道如何 get/set 以下 CreateUrl() WebMethod 的属性。我想学习如何使用整个 WebService 但从这里开始。

在下面的示例中,我将 URL 发送到 CreateURL() 方法,这将缩短 URL 并执行其他任务;我不知道如何从返回的 ShortUrl.Container Class 中获取属性:在 class(es) 返回到我的调用方法后,我没有成功访问数据。

// 网络方法

public class API  : System.Web.Services.WebService {

[WebMethod]
public ShortUrl.Container CreateUrl(string real_url)
{
    ShortUrl.Container oShortUrl = new ShortUrl.Container();

    oShortUrl.RealUrl = real_url;
    oShortUrl.ShortenedUrl = ShortUrl.Utils.UniqueShortUrl();
    oShortUrl.CreateDate = DateTime.Now;
    oShortUrl.CreatedBy = HttpContext.Current.Request.UserHostAddress;

    ShortUrl.Utils.AddUrlToDatabase(oShortUrl);

    oShortUrl.ShortenedUrl = ShortUrl.Utils.PublicShortUrl(oShortUrl.ShortenedUrl);

    return oShortUrl;
    }
}

// ShortUrl.Container class 作为 oShortUrl

返回
namespace ShortUrl
{
    /// <summary>
    /// Container for the ShortURL object
    /// </summary>
    public class Container
    {
        private string _real_url;
        private string _short_url;
        private DateTime _create_date;
        private string _created_by;

        public Container()
        {
            this.CreateDate = DateTime.Now;
            this.CreatedBy = "tap";
            this.RealUrl = null;
            this.ShortenedUrl = "Unknown";
        }

        public string RealUrl
        {
            get { return _real_url;  }
            set { _real_url = value; }
        }

        public string ShortenedUrl
        {
            get { return _short_url;  }
            set { _short_url = value; }
        }

        public DateTime CreateDate
        {
            get { return _create_date;  }
            set { _create_date = value; }
        }

        public string CreatedBy
        {
            get { return _created_by;  }
            set { _created_by = value; }
        }
    }
}

在 VS2013 中,我添加服务引用以指向 http://tap.tools.api.asmx 作为服务端点,并将 VS2013 引用命名为 ShortenUrl。 VS2013 生成 APISoapClient 和 Container classes.

// get/set properties of the ShortUrl.Container class
// by means of APISoapClient
ShortenUrl.APISoapClient u = new ShortenUrl.APISoapClient();
u.CreateUrl("http://clintongallagher.com/tag-target-url.html");


// get/set properties of the ShortUrl.Container class
// by means of Container class
ShortenUrl.Container c = new ShortenUrl.Container();
string url = c.RealUrl;

我都没有得到任何结果,我认为我的问题是在 public ShortUrl.Container CreateUrl(string real_url) 方法中实例化的 oShortUrl 对象的实例。我不知道如何从容器 class returns 的 oShortUrl 实例获取任何属性到我的方法。

// oShortUrl 
ShortUrl.Container oShortUrl = new ShortUrl.Container();

奇怪的是,asmx 的使用听起来既陈旧又过时,但我从未使用过 - 任何 - WebServices,这解释了为什么我很虚弱并让自己陷入法庭的怜悯。

// 编辑:2016-07-19 ~2:41pm

VS2013 从 WSDL 生成了几个 classes,其中两个在 Intellisense 中似乎很有用...

// class APISoapClient 和 class 容器

当我将局部变量与 APISoapClient 一起使用时,会生成一个缩短的 URL,正如我使用 SQL Management Studio 所见,并注意所有数据均已正确生成,但我无法 get/set 在任何其他 WebMethods 或属性上 get/set 数据...

// Exposes two WebMethods: CreateUrl and GetUrl    
ShortenUrl.APISoapClient u = new ShortenUrl.APISoapClient();  

// Does generate the shortened URL
u.CreateUrl("http://clintongallagher.com/tag-target-url.html");
// Should return the URL that was shortened but doesn't
u.GetUrl("i2Z5H");

还有...

// Exposes the properties in Intellisense but does not return data
ShortenUrl.Container c = new ShortenUrl.Container();

// returns 1/1/0001 12:00:00 AM 
lblCreateDate.Text = "CreateDate: " + c.CreateDate.ToString();
// returns nothing
lblCreatedBy.Text = "CreatedBy: " + c.CreatedBy;
// returns nothing
lblRealUrl.Text = "RealUrl: " + c.RealUrl;
// returns ShortenUrl.Container
lblShortenedUrl.Text = "ShortenedUrl: " + u.GetUrl("i2Z5H"); 

如果我理解您想要获得的是从 Web 方法返回的容器。如果是这样,那么只需创建一个变量类型的 Container 并将方法调用分配给它。喜欢 ShortUrl.Container c = u.CreateUrl(...) 然后从 c 你可以得到你正在寻找的值。

想想这个@clintongallagher。当您执行以下调用时,

ShortenUrl.APISoapClient u = new ShortenUrl.APISoapClient();
u.CreateUrl("http://clintongallagher.com/tag-target-url.html");


[WebMethod]
public ShortUrl.Container CreateUrl(string real_url)
{
    ShortUrl.Container oShortUrl = new ShortUrl.Container();

    oShortUrl.RealUrl = real_url;

    //here you're assigning a value to this object, let's say 'A'
    oShortUrl.ShortenedUrl = ShortUrl.Utils.UniqueShortUrl(); 

    oShortUrl.CreateDate = DateTime.Now;
    oShortUrl.CreatedBy = HttpContext.Current.Request.UserHostAddress;

    //then here you're saving the object with the Shortened value 'A' you just got
    ShortUrl.Utils.AddUrlToDatabase(oShortUrl); 

    /*
     *finally you're replacing the Shortened value with another value, 
     *let's say 'B', which is the object you're going to return*/
    oShortUrl.ShortenedUrl = ShortUrl.Utils.PublicShortUrl(oShortUrl.ShortenedUrl);

    return oShortUrl;
}

我不知道 GetUrl(shortened_value) 应该如何工作,但是,假设它将从数据库中获取 shortened_value 传入,当然结果不会相同,因为保存的缩短值是 'A' 而您要求的是 B.