2010-11-12 112 views
2

我遇到了一个问题,我试图将非基元(和用户定义的)数据类型传递给WebMethod。有没有一种方法可以做到这一点?下面是我的代码示例:我可以将非原始数据类型传递给WebMethod吗?

[WebMethod] 
public bool GetTableRecordCnt(int i, String str, DateTime? lastUpdatedDate, UserDefinedType udt, out FDT_SCHEDULER_STATUS[] schedulerTable) 
{ 
    //code 
} 

当我尝试从我的客户端应用程序调用这个函数,我得到以下错误:“无法读取从传输连接数据”

如果我将UserDefineType参数替换为原始数据类型(例如int),则客户端能够从WebMethod获得响应。

在此先感谢您的帮助。

编辑:

调用从客户端应用程序代码:

UserDefinedType udt = new UserDefinedType(); 
UserDefinedType1[] tableRecords = ThisApplication.FillArray(); 

bool result = WebServiceReferenceName.GetTableRecordCnt(1, "tableName", "10/10/2010 12:00:00", udt, out tableRecords); 

这是正在传递到Web方法的参数的过于简单化,但毕竟是在每个参数的数据是什么会通过。

+0

哪个平台是您的客户端应用程序使用? winforms或asp.net? – 2010-11-12 13:44:28

+0

客户端应用程序使用Windows Mobile 5.0设备的winforms。 – AndHeCodedIt 2010-11-12 13:45:49

+0

我们可以看到调用代码吗? – Schenz 2010-11-12 13:47:35

回答

0

OK,所以查不到什么问题终于给了我一些救济=)

显然有就是,当你传递一个UserDefinedType到Web方法的变量可以命名的字符数限制。经过测试后,我在代码中添加了这个新功能。我发现,缩短了下列变量名:

SchedulerRecordCount 

到:

SchedRecCnt 

现在让我的Windows Mobile应用程序和C#的Web服务之间传递数据。去搞清楚!

现在有没有人知道是否有一个特定的数字限制的字符数可以用来命名UserDefinedType中的变量将传递给Web方法,或者这可能是我的环境问题结束?

+0

听起来更像是环境问题,但我可以'找不到任何证据.. – 2010-11-16 14:57:44

0

是的,只要您的类型为serializable即可。

+0

该类型是否需要可序列化,还是在将它传递给WebMethod之前还需要序列化它? – AndHeCodedIt 2010-11-12 14:25:48

+0

不幸的是,这不起作用。正在调用Web服务的其他函数中传递相同的类型。不过值得一试。谢谢! – AndHeCodedIt 2010-11-12 14:50:18

+0

因此,也许通过缩短它的名称比你的webconfig中的maxContentLength小。 (我认为这是寻找的标签)。我知道我有一个webmethod间歇性失败,但我通过更改maxContentLength而不是类名来修复它,这两种方法似乎都会使您的总输入字符串达到最大长度要求。 – Gary 2013-01-18 21:42:32

1

是的,你可以。您将需要创建一个匹配UserDefinedType的公共属性的对象。这很简单,如果您使用.Net Web服务并将该方法标记为[ScriptMethod()],然后它将响应JSON。

下面是一个例子:

public class UserDefinedType 
{ 
    public int Property1 { get; set; } 
    public string Property2 { get; set; } 
} 

,你可以使用下面的JavaScript函数传入一个PARAM:

var param = "{ Property1 : '"+prop1Val+"', Property2 : '"+prop2Val+"'}"; 

注意,您必须声明JSON对象作为字符串另有传递如果您使用jQuery.ajax(...),它会将您的param对象序列化为编码参数字符串,而不是将其作为本机JSON字符串传递。

还有一些不错的库,它们会照顾JSON数据对象来为您编写字符串,例如jquery-json 2.2。使用这个,你可以简单地将参数传递为$ .toJSON(param)。

最后,这里使用jQuery将请求发送到一个ASP .NET Web服务的一个例子:

$.ajax({ 
     type: "POST", 
     url: "/Services/YourService.asmx/YourMethod", 
     cache: false, 
     data: $.toJSON(param), // Convert JSON object to String for Post 
     contentType: "application/json; charset=utf-8", 
     dataType: "json", 
     success: function (response) { 
      HandleResponse(response.d) 
     }, 
     error: function (e) { 
      alert('error during web service call'); 
     } 
    }); 
+0

不幸的是,这没什么帮助。我没有为这个项目使用JSON和JQUERY。 – AndHeCodedIt 2010-11-12 14:40:32

+1

@AndHeCodedIt:当你发布你的问题时,你不清楚你是使用Windows Forms还是ASP .Net。使用Windows Form方法,您应该有一个SOAP代理类设置,使您可以为用户定义的类型创建代理对象。请记住,它只是来回映射的公共属性。 – 2010-11-12 15:19:06

+0

感谢您提供的信息,如果您受到侮辱,并不意味着侮辱您。我也做了+1,因为你的答案在其他应用程序中会有用=) – AndHeCodedIt 2010-11-12 15:30:26

1

现在我有一个答案,以我自己的问题。我已将Web服务方法签名更改为:

[WebMethod] 
public bool GetTableRecordCnt(int i, String str, DateTime? lastUpdatedDate, object udt, out FDT_SCHEDULER_STATUS[] schedulerTable) 
{ 
    //code 
} 

请注意,我将UserDefinedType类型更改为object。现在我可以让我的客户与我的Web服务通话。有没有人有任何理由不应该这样做?

1

这说明您的问题:Passing a custom object to the web service

可能是你UserDefinedType包含“花哨”像列表,字典或什么东西,不能被序列化因此你会得到错误。

我很惊讶你可以像这样传递UserDefinedType,确保你得到了你需要的所有属性,我怀疑你会为非原始部分获得很多空值。

+0

奇怪的是用户定义的类型不包含花哨的东西。它只包含原始数据类型(字符串)。这个问题更奇怪的部分是,这个用户定义类型被传递给Web服务的时间超过了我尝试去做的时间,并且这个操作很好。奇怪,听起来像是我做错了什么。 – AndHeCodedIt 2010-11-15 12:48:17

+0

@AndHeCodedIt你怎么能告诉它比你想要的更多次?也许问题出在你的调试技术上? – 2010-11-15 12:59:07

+0

我的Web服务中还有两种接受此用户定义类型的方法。他们已经存在了6个月以上,没有任何问题。当我调用2个现有Web方法之一并传递用户定义的类型时,Web服务成功返回信息。当我调用我的新Web服务方法并传递用户定义的类型时,我没有从Web服务获得响应。这更清楚吗? – AndHeCodedIt 2010-11-15 13:04:09

相关问题