我可以将非原始数据类型传递给WebMethod吗?

时间:2010-11-12 13:36:56

标签: c# web-services .net-2.0

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

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

当我尝试从客户端应用程序调用此函数时,出现以下错误:

“无法从传输连接中读取数据。”

如果我用基本数据类型(例如int)替换UserDefineType参数,则客户端可以从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方法的参数的粗略过度简化,但每个参数中的数据都是传递的。

5 个答案:

答案 0 :(得分:1)

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

以下是一个例子:

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

您可以使用以下javascript作为参数传递:

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

注意,您必须声明JSON对象作为字符串传递,否则如果您使用的是jQuery.ajax(...),它会将您的param对象序列化为编码的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');
        }
    });

答案 1 :(得分:1)

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

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

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

答案 2 :(得分:1)

这解释了您的问题:Passing a custom object to the web service

你的UserDefinedType可能包含像List,Dictionary这样的“花哨”东西或者无法序列化的东西,因此你会收到错误。

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

答案 3 :(得分:0)

是的,只要您的类型为serializable,就可以使用此功能。

答案 4 :(得分:0)

好的,所以找出问题所在最终给了我一些缓解=)

显然,将UserDefinedType传递给Web方法时,可以命名变量的字符数有限制。在我的代码中使用我为这个新函数添加的每个部分进行测试之后。我发现缩短了以下变量名称:

SchedulerRecordCount

为:

SchedRecCnt

现在允许在我的Windows移动应用程序和c#Web服务之间传递数据。 GO Figure!

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