【问题标题】:Passing collection via asmx通过 asmx 传递集合
【发布时间】:2010-08-10 11:53:47
【问题描述】:

我有一个配对列表(CarType(Enum)、code(string))。不幸的是,在这个集合中代码不是唯一的。

Van,C1
Van,C2
Pickup,C1

如何通过 asmx webservice 传递这个集合。

现在我将 KeyValuePair[] 作为 webMethod 中的参数

[webmethod]
public void DestroyCars(KeyValuePair<string, CarType>[] cars)
{
//implementation.
}

但是当我更新我的 webreference(不是 servicereference)并将 KeyValuePair[] 的实例放入

service.DestroyCars(someinstance of KeyValuePair<string, CarType>[])

我得到异常,因为我必须有 KeyPairValuOfStringCarType。

为什么会这样以及如何解决?

为了更清楚:

我想通过webservice传递多维集合。

我创造

[网络方法] 公共无效 DestroyCars(KeyValuePair[] 汽车) { //执行。 }

我更新了我的应用程序的网络参考。

当我想使用 KeyValuePair[] 的新实例从我的应用程序中调用此 webmethod 时,我收到错误消息,指出此参数不可分配给我的 webmethod 的参数类型。

Intellisense 告诉我这个参数的类型是 KeyPairValuOfStringCarType 与不是真的。

我在 net.reflector 中检查了这个类型的类型,我发现它是一个字符串。

我知道没有意义。这是我寻求帮助的方式:/

【问题讨论】:

  • 您能与我们分享异常消息吗?
  • 对不起,也不例外。我的意思是错误。
  • 您能否与我们分享相关信息无论是异常、错误还是其他原因? — 另外,“因为我必须有 KeyPairValuOfStringAndCarType”是什么意思?
  • 感谢 intellisense 我知道,我的 webmethod 的参数是 KeyPairValuOfStringAndCarType。我可以在客户端创建这种类型的实例。错误是“参数类型“System.Collections.Generic.KeyValuePair[]”不可分配给参数类型 mywebservicenamespace.KeyPairValuOfStringCarType
  • KeyPairValuOfStringAndCarType 不等同于 KeyPairValuOfStringCarType

标签: c# web-services collections


【解决方案1】:

您遇到此错误的原因:

“参数类型“System.Collections.Generic.KeyValuePair[]”不可分配给参数类型 mywebservicenamespace.KeyPairValuOfStringCarType

是因为当 asp.net 为您创建 Web 服务代理(Web 服务引用)时,它“复制”了您的 Web 服务公开的任何自定义类型,在这种情况下,KeyValuePair&lt;string, CarType&gt; 被转换为KeyValuePairOfStringCarType代理,以便您可以将它们传递到 Web 服务中。

调用 web 服务需要做的是(这对我有用,在 Visual Studio 2008 中,针对 asmx web 服务):

// Create a new CarKeyValuePair in your web service project
public struct CarKeyValuePair
{
    public string Key { get; set; }
    public CarType CarType { get; set; }
}

// Change your web method to use this instead of KeyValuePair
[WebMethod]
public void DestroyCars(CarKeyValuePair[] cars)
{
    // Implementation here
}

然后您可以更新您的 Web 服务引用并在调用您的 Web 服务的代码中编写类似于以下内容的内容:

service.DestroyCars(new CarKeyValuePair[] { new CarKeyValuePair() { CarType = CarType.Pickup, Key = "C1" } });

// or

var cars = new List<CarKeyValuePair>();
var car = new CarKeyValuePair();
car.CarType = CarType.Pickup;
car.Key = "C1";
cars.Add(car);
service.DestroyCars(cars.ToArray());

【讨论】:

  • @phenevo,不是问题 =) 我怀疑你已经知道,鉴于你提到 webreference(not servicereference),生活就变成了 lot 如果您移至服务引用和共享类型程序集,则更容易,因为类型更容易共享,这就是我对基于 WCF 的服务的经验,不确定它对 asmx 有什么影响 =)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-03-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多