问题描述
我正在尝试将对象从 .NET MVC 传递到起诉 SOAP 的 Web 服务 (VB.NET)。 传递单个字段有效,但是当我尝试传递对象时,它会引发错误
Cannot convert from Project.Models.Table to Project.WebService.Table
要求 将对象从 MVC 传递到 Web 服务。
下面是我的网络服务代码。
问题:我是否需要在获得对象后进行序列化。
<WebMethod()>
Public Function FormData(ByVal obj As Table)
Dim sqlconn As New sqlConnection
Dim sqlcmd As New sqlCommand
Try
Dim formSerializer As New XmlSerializer(GetType(Table))
Using reader As TextReader = New StringReader(obj)
data = formSerializer.Deserialize(reader)
End Using
下面是我的 MVC 控制器,我添加了服务引用。
public ActionResult Submission(Table data)
{
Table obj = new Table();
FormService.WebServiceSoapClient client = new FormService.WebServiceSoapClient();
obj = client.FormData(data);
return obj;
}
错误是在将数据对象从控制器传递到 Web 服务时。
在两个项目中都添加了包含所有字段的 Table 模型类。
感谢您的帮助。
谢谢。
更新 根据@Panagiotis Kanavos 的建议,我尝试使用 AutoMapper。所以下面是工作代码。我能够将值存储到数据库中。请让我知道它是否正确和安全的方式。谢谢。
客户端
public JsonResult PostMethod(Table data)
{
FormService.WebServiceSoapClient client = new FormService.WebServiceSoapClient();
var config = new MapperConfiguration(cfg => { cfg.CreateMap<Table,Table_WS>(); });
IMapper iMapper = config.CreateMapper();
var destination = iMapper.Map<Table,Table_WS>(data);
var result = client.FormData(destination);
网络服务
<WebMethod()>
Public Function FormData(ByVal Obj As Table_WS) As Table_WS
sqlconn.ConnectionString = CONNECTION_STRING
sqlcmd.Connection = sqlconn
sqlconn.open()
sqlcmd.CommandType = Data.CommandType.StoredProcedure
sqlcmd.CommandText = "SPR_INSERT"
sqlcmd.Parameters.AddWithValue("@NAME",IIf(Isnothing(Obj.NAME),dbnull.Value,Obj.NAME))
感谢您的帮助。
解决方法
首先,如果你传递了那么多数据,我认为你应该发布它,而不是获取它,因为你显然试图发送一些东西,而不是检索。 其次 - 我不知道 VB.NET,但我认为 '' 代表注释,因此您的代码将始终尝试将数据反序列化为 XML。您可以尝试传递参数以通知您的 Web 方法使用哪种序列化方法。再次 - 我不确定它是如何在 VB.NET 中完成的。
,您无法在 2 个表之间进行转换。 公共函数 FormData(ByVal obj As Table) 期待 Project.WebService.Table 并且您正在传递 Project.Models.Table。我认为这是正确的顺序。 您需要将 Project.WebService.Table 传入 client.FormData。 您必须将 Project.Models.Table 转换为 Project.WebService.Table
像这样的东西应该可以工作。
public ActionResult Submission(Table data)
{
var client = new FormService.WebService1();
var table = new FormService.Table();
table.FirstName = data.FirstName;
table.LastName = data.LastName;
var obj = client.FormData(table);
data.FirstName = obj.FirstName;
data.LastName = obj.LastName;
...
}
通过序列化实现这一点的唯一方法是使用 JSON 并将其作为字符串传递给 Web 方法,此时您可以转换为您想要的任何类。