ASMX ASP.奇怪的返回类型由服务方法

本文关键字:服务 方法 返回类型 ASP ASMX | 更新日期: 2023-09-27 18:18:51

我是ASP.NET的新手。我想创建一个包含一个方法的简单Web服务:

代码如下:

    [WebService(Namespace = "http://cstest.pl/PaintService.asmx/")]
    [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
    [System.ComponentModel.ToolboxItem(false)]
    public class PaintService : WebService
    {
        private Random r = new Random();  
        [WebMethod(Description =("Something"))]
        public Nullable<Point> StartDraw(int startX, int startY, int width, int height)
        {
            try
            {
                int X = r.Next(startX, width);
                int Y = r.Next(startY + height);
                return (new Point(X, Y));
            }
            catch (ArgumentOutOfRangeException e)
            {
                Console.WriteLine(e.Message);
                return null;
            }
        }
    }

然后我有一个客户端类,给我一个错误"Cannot implicitly convert type 'WinFormsConsumer.localhost.Point' to 'System.Drawing.Point"

localhost是我添加到WinFormsConsumer类作为Add Service Refference...的web服务的名称,通过选择Web Refference并传递http://localhost:2540/PaintService.asmx?wsdl

using System;
using System.Collections;
using System.Drawing;
using System.Windows.Forms;
    namespace WinFormsConsumer  
     {
            public partial class Form1 : Form
            {
                localhost.PaintService ps = new localhost.PaintService();
                private Random r = new Random();
                private Timer timer = new Timer();
                private ArrayList list = new ArrayList();
               public Form1()
               {
                  ...
               }
                private void Timer_Tick(object sender, EventArgs e)
                {
                   //below line gives the error
                   Point temp = ps.StartDraw(ClientRectangle.X, 
        ClientRectangle.Y, ClientRectangle.Width, ClientRectangle.Height);
                    this.Invalidate();
                }
            }
      }

为什么我得到这个错误?我不明白,为什么看起来从Web服务返回的Point类型是"不同的",那些在系统中定义的?我错过了什么?

ASMX ASP.奇怪的返回类型由服务方法

默认情况下,Visual Studio不会重用web服务公开的所有类型。它将System.Drawing.Point视为第三方类型,并定义与其签名匹配的"代理"。您必须告诉它您希望在代理中"重用"哪些类型。

编辑服务引用并选中"在指定的引用程序集中重用类型"的复选框。然后确保"System.Drawing.DLL"可用并选中

关于MSDN的更多信息

我做了一些研究,答案是:这是不可能的。这是ASMX的弱点,也是引入WCF的原因之一。我已经找到了一些工作,比如创建"SwallowCopy"类等,但这并不是真正的好事情,只能与类一起工作。

所以假设我所说的,加上它只是一个项目,我必须使用它,我决定只使用代理对象。客户不需要知道它,它现在符合我的需求。