所以我有一个返回自定义类型的web服务
public List<MyNS.Product> GetProducts(string filter)
{
...
}
MyNS.Product
在另一个程序集中定义。我的客户端应用引用相同的程序集。当我向客户端应用添加服务引用时,返回类型为MyServiceReference.Product
。
var client = new MyServiceReference.dataSoapClient();
var products = client.GetProducts("derp");
// products type is MyServiceReference.Product[]
如何让我的客户端应用程序识别出MyServiceReference.Product
类型的返回对象实际上是它已经知道的MyNS.Product
类型? (数组部分的列表不是什么大问题,只是T型)
webservice是常规asmx,是网站的一部分。我正在“添加服务引用”以将服务添加到visual studio中的客户端项目中。
编辑:以下是添加服务参考对话框中“高级”按钮的选项。我将集合类型从Array更改为List。我也尝试使用产品类型专门选择我的库,但这也无济于事。
答案 0 :(得分:3)
添加服务引用时,请告诉VS重用业务库中的对象。只要您的服务和客户使用相同版本的业务库,visual studio就会选择正确的类型而不是服务代理。
答案 1 :(得分:2)
如果不修改自动生成的Web服务引用代码(我不建议),或者使用包装类包装Web引用调用来获取和返回具有预期类型的对象,则无法执行此操作。
添加Web引用时,IDE会根据SOAP返回的定义自动生成与Web服务接口匹配的类。因此,如果您使用像Product这样的复杂类型,它将自动生成具有相同公共属性的自己的Product类。
答案 2 :(得分:0)
共享类型是WCF中引入的功能,但旧的asmx Web服务中没有。对于旧的ASMX,请尝试SchemaImporterExtension:link
编辑:
好。所以我测试了这可以通过手动创建服务合同,请求和响应类以及手动创建通道来完成。您需要在合同上设置[XmlSerializerFormat]
,并确保您的对象有[SerializableAttribute]
答案 3 :(得分:0)
由于您正在使用soap(.asmx创建SOAP Web服务),客户端应该能够从您的asmx创建的soap的wsdl页面中提取类型,您只需要确保传递的对象是xml可序列化的。
作为一般规则,我将创建一个dto(数据传输对象)来存储传递给客户端的数据,以确保它是可序列化的,并将其与我的应用程序的其余部分分离,以防止更新现有对象引起的问题。
这也适用于非.NET客户端,例如,你可以用同样的方式从.NET中使用.NET调用
答案 4 :(得分:0)
嗯,我知道这是一个老帖子,但(不幸的是)我有同样的问题,所以我认为我可以分享我的解决方案。
<强> PROLOGUE 强>
我正在使用asmx web服务(.net版本2.0),我有一个web方法,它返回一个自定义类型(带有[serializable]属性),在程序集中引用这两个项目(实际上是Web服务)和客户)分享。
我发现的解决方案是让visual studio为您创建客户端(在客户端项目中),然后修改创建的Reference.cs文件(要查看它,您必须打开“显示所有文件” )。
N.B。客户端项目的.NET版本必须为2.0
但要小心!!
将其作为自动生成的文件,如果更新Web服务引用,则所有更改都将丢失!所以要注意 LOT 。
正如您在此文件(reference.cs)中看到的那样,使用所有属性重新创建自定义类型,如果来自另一个属性的类inerith(如我的情况),则还会重新创建基类。显而易见的问题是重新创建的类型与共享程序集不同。
我找到的解决方案是重命名生成的类(例如:在名称[YOUR_BASECLASS_NAME =&gt; _YOUR_BASECLASS_NAME]之前放置一个“_”)然后在Reference.cs的“using”部分中 这样的东西:
using YOUR_BASECLASS_NAME = SHAREDLIBRARY.BASECLASS
using YOUR_CLASS_NAME = SHAREDLIBRARY.CLASS
为您使用的所有课程执行此操作。
Compile..etvoilà!我知道这不是一个很好的解决方案,但它是我发现的最聪明的。