English 中文(简体)
我如何让我的客户应用程序 认出一个来自我的网络服务对象 已经知道的类型?
原标题:How do I make my client app recognize an object from my webservice as a type it already knows?

所以我有一个网络服务 返回自定义类型

public List<MyNS.Product> GetProducts(string filter)
{
    ...
}

MyNS. production 定义在另一个组装中。 我的客户端应用程序引用相同的组装 。 当我为我的客户端应用程序添加服务引用时, 返回类型为 MyServiceReference. production

var client = new MyServiceReference.dataSoapClient();
var products = client.GetProducts("derp");
// products type is MyServiceReference.Product[]

我如何用我的客户端应用程序来识别返回类型 MyServiceReference. production 的对象实际上是它已经知道的 MyNS. production 类型? ( 数组部分的列表不是大问题, 只有 T 类型 )

网络服务是网站的常规服务。 我正在做“ 添加服务参考”, 在视觉工作室内为我的客户项目添加服务 。

编辑 : 这是添加服务引用对话框中的“ 高级” 按钮的选项。 我将收藏类型从 Array 更改为 List 。 我还尝试用产品类型专门选择我的库, 但没有帮助 。

"https://i.sstatic.net/6nmeJ.png" alt="添加服务参考选项"/ >

最佳回答

要做到这一点,就必须修改自动生成的网络服务参考代码(我对此不表示意见),或者用一个包装类将您的网络参考电话包装成一个包装,用预期类型接收和返回对象。

当添加 Web 引用时, IDE 自动生成一个与基于通过 SOAP 返回的定义的网络服务界面匹配的类别。因此,如果使用像产品这样的复杂类型,它将自动生成具有相同公共属性的产品类别。

问题回答

当您正在添加服务参考时,请告诉 VS 从您的商业图书馆中重新使用对象。只要您的服务和客户使用相同的商业图书馆,视觉工作室将选择正确的类型,而不是服务代理。

由于您正在使用肥皂(.asmx 创建 SOAP 网络服务), 客户应该能够从您正在创建的肥皂 s wsdl 页面上提取打字功能, 您只需要确定您通过的东西是 xml 可序列的 。

作为一般规则,我将创建一个dto(数据传输对象)来存储传递给客户的数据,以确保数据可以序列化,并与我的应用程序其他部分脱钩,以防止更新现有对象造成的问题。

这对非.NET 客户同样有用,例如,您也可以用同样的方式在 java 使用来自.NET 的 SOAP 电话。

共享类型是WCF中引入的特性, 但不是旧的 asmx 网络服务中的特性。 对于旧的 ASMX 尝试 Schemaimmer Extension : < a href="http://msdn. microsoft. com/ en- us/library/ w46ccb0h.aspx" rel = “ nofollow” >link

Edit: OK. So I tested and this can be done by manually creating service contract, request and response classes and manually creating channel. You need to set [XmlSerializerFormat] on your contract and make sure your object has [SerializableAttribute]

嗯,我知道这是一个旧的 职位,但(不幸的) 我有一个同样的问题, 所以我想我可以分享我的解决方案。

" 强 " / " 强 "

我使用 asmx 网络服务 (.net 版本 2. 0), 并使用一种网络方法, 返回项目( 实际的网络服务和客户) 共享的组装中引用的自定义类型( 带有[ 可 属性 。

我找到的解决方案是让视觉工作室为您创建客户端( 在客户端项目中), 然后修改创建的引用. cs 文件( 要看到它, 您必须打开“ 显示所有文件 ” ) 。

客户项目 s.NET 版本必须为 2.0 。

“强势”BUT BEWARE!!“(强势)BUT BEWARE!!!(强)BUT BEWARE!!(强)

是一个自动生成的文件, 如果您更新 Web 服务引用, 所有更改都会是 LOST! 所以给您一个 < enough > LOT < / strong > 的注意 。

您可以在此文件( reference. cs) 中看到, 自定义类型将重新生成所有属性, 如果从另一个属性( 如我的情况) 重新生成类内 Inerith, 也重新创建基级。 显然问题在于重创建的类型与共享组群不同 。

The solution i ve found is to rename the generated classes (for ex: put an "_" before the names [YOUR_BASECLASS_NAME => _YOUR_BASECLASS_NAME]) and then in the "using" part of the Reference.cs put something like this :

using YOUR_BASECLASS_NAME = SHAREDLIBRARY.BASECLASS
using YOUR_CLASS_NAME = SHAREDLIBRARY.CLASS

为您使用的所有课程做此操作 。

我知道这不是一个非常好的解决方案,但它是我找到的最聪明的解决方案。





相关问题
Anyone feel like passing it forward?

I m the only developer in my company, and am getting along well as an autodidact, but I know I m missing out on the education one gets from working with and having code reviewed by more senior devs. ...

NSArray s, Primitive types and Boxing Oh My!

I m pretty new to the Objective-C world and I have a long history with .net/C# so naturally I m inclined to use my C# wits. Now here s the question: I feel really inclined to create some type of ...

C# Marshal / Pinvoke CBitmap?

I cannot figure out how to marshal a C++ CBitmap to a C# Bitmap or Image class. My import looks like this: [DllImport(@"test.dll", CharSet = CharSet.Unicode)] public static extern IntPtr ...

How to Use Ghostscript DLL to convert PDF to PDF/A

How to user GhostScript DLL to convert PDF to PDF/A. I know I kind of have to call the exported function of gsdll32.dll whose name is gsapi_init_with_args, but how do i pass the right arguments? BTW, ...

Linqy no matchy

Maybe it s something I m doing wrong. I m just learning Linq because I m bored. And so far so good. I made a little program and it basically just outputs all matches (foreach) into a label control. ...

热门标签