生成XML文档时出错。 Job不是预期的类型

时间:2013-08-09 15:26:46

标签: c# .net web-services xml-serialization

我正在使用MVC3编写一个Web应用程序,但在尝试将对象传递给控制器​​并显示它时,它似乎无法识别类型或其他内容。

我有一个Job对象,并JobService返回Job,如下所示:

public Job View(int jobId)
{
    Job job=_jobRepository.Jobs.Where(x => x.Id == jobId).FirstOrDefault();
    return job;
}

在WebService中,我将View称为:

[WebMethod]
public Job GetJob(GetJobRequest getJobRequest)
{
    var getJobResponse = new GetJobResponse();
    getJobResponse.Job = _jobService.View(getJobRequest.Id);
    return getJobResponse.Job;
}

然后Controller调用它:

public class JobsController : Controller
{
    public ActionResult Index()
    {
        var jobModel = new JobModel();

        using (var webServiceSoapClient = new WebServiceSoapClient())
        {
            var getJobRequest = new GetJobRequest();
            getJobRequest.Id = 26038;
            jobModel.Job = webServiceSoapClient.GetJob(getJobRequest);
        }
        return View(jobModel);
    }
}

它正在抛出这个错误:

  

System.Web.Services.Protocols.SoapException:服务器无法处理请求。 ---> System.InvalidOperationException:生成XML文档时出错。 ---> System.InvalidOperationException:不期望类型为System.Data.Entity.DynamicProxies.Job_55765AEC3BD02AFD7E0527408ED5746E1054965A59B82A127B5A688C19C61D5B。使用XmlInclude或SoapInclude属性指定静态未知的类型。      at Microsoft.Xml.Serialization.GeneratedAssembly.XmlSerializationWriter1.Write9_Job(String n,String ns,Job o,Boolean isNullable,Boolean needType)      在Microsoft.Xml.Serialization.GeneratedAssembly.XmlSerializationWriter1.Write18_GetJobResponse(Object [] p)      在Microsoft.Xml.Serialization.GeneratedAssembly.ArrayOfObjectSerializer13.Serialize(Object objectToSerialize,XmlSerializationWriter writer)      在System.Xml.Serialization.XmlSerializer.Serialize(XmlWriter xmlWriter,Object o,XmlSerializerNamespaces namespaces,String encodingStyle,String id)      ---内部异常堆栈跟踪结束---      在System.Xml.Serialization.XmlSerializer.Serialize(XmlWriter xmlWriter,Object o,XmlSerializerNamespaces namespaces,String encodingStyle,String id)      在System.Web.Services.Protocols.SoapServerProtocol.WriteReturns(Object [] returnValues,Stream outputStream)      在System.Web.Services.Protocols.WebServiceHandler.WriteReturns(Object [] returnValues)      在System.Web.Services.Protocols.WebServiceHandler.Invoke()      ---内部异常堆栈跟踪结束---

起初我将GetJobResponse传递给服务但是我现在试图让它变得尽可能简单,以使其正常工作,我仍然无法弄明白。我已经看到有其他问题建议使用XmlInclude和东西,但它仍然无法正常工作。

申请:

public string SerializeObjectToXMLString(object theObject)
{
    // Exceptions are handled by the caller

    using (System.IO.MemoryStream oStream = new System.IO.MemoryStream())
    {
        System.Xml.Serialization.XmlSerializer oSerializer = new System.Xml.Serialization.XmlSerializer(theObject.GetType());

        oSerializer.Serialize(oStream, theObject);

        return Encoding.Default.GetString(oStream.ToArray());
    }
}

对于View在测试中返回的作业,它通过了测试,所以我猜这个问题来自我的网络服务。

请帮助meeee:'(

2 个答案:

答案 0 :(得分:2)

我认为问题是因为您正在使用Entity Framework,当它获取Job对象时,它正在创建Job类的动态代理。

我之前通过将以下内容添加到DataContext的构造函数

来解决了这个问题
public JobDataContext()
            : base("ConnectionString")
        {
            this.Configuration.ProxyCreationEnabled = false;
        }

答案 1 :(得分:0)

我遇到了类似的问题,因为我试图对一些自定义类进行XML序列化/反序列化。 我有一个父类和一个子类。他们都被宣布为[Serializable]。我遇到了您报告的相同错误,我的解决方案是将此属性添加到父类: [XmlInclude(typeof运算(儿童))]。我认为这个声明告诉XmlSerializer,当你遇到类型为Parent的对象,并且你必须序列化它时,请同时考虑它可能是一个类型为child的实例。它对我有用。

因此,我认为您应该为GetJobRequest课程和Job添加正确的序列化属性。