2011-12-07 2 views
1

나는 서버 - 클라이언트 애플리케이션에서 작업 중이다. 통신은 webservice webmethods를 사용하여 수행됩니다. 서버와 클라이언트 모두 C#으로 작성됩니다. 나는 며칠 동안 그것과 싸우고 있었지만 그것을 해결할 수 없었다.C#에서 SOAP로 웹 서비스를 통해 객체 전달하기

webservice를 통해 복잡한 클래스를 전송하는 데 문제가 있습니다. 지금까지 많은 것을 시도했지만 아무 것도 작동하지 않았습니다.

각각의 WebMethod

은 다음과 같습니다 ServiceResult 클래스 반환

public class ServiceResult 
    { 
     public ResultStatus Status; 
     public object ResultObject; 

     public ServiceResult(ResultStatus status, object resultObject) 
     { 
      Status = status; 
      ResultObject = resultObject; 
     } 
    } 

ResultStatus이 열거입니다, ResultObject 실제 반환 값입니다. 문제는 내가 웹 서비스를 통해 복잡한 수업을 보내려고했을 때였 다.

예를 들어, 개인 클래스가있는 추상 클래스 인 Job이 있습니다.

public abstract class Job : IComparable<Job> 
{ 
    public static readonly int DefaultDelay = 5000; 

    private int _jobID; 
    private int _referringID; 
    private JobType _jobType; 
    protected JobState _jobState; 
    private JobPriority _jobPriority; 
    [...] 
} 

하지만 작업 클래스를 상속 클래스를 전송하려고 할 때이 오류가의 WebMethod를 통해 (의 조바를 부르 자).

System.Web.Services.Protocols.SoapException: Server was unable to process request. ---> System.InvalidOperationException: There was an error generating the XML document. ---> System.InvalidOperationException: The type Job[] may not be used in this context.

첫 번째 오류에 대한했다 : 나는 어떤의 WebMethod에서 명시 적 조바 반환 형식이 없기 때문에 내의 WebMethod를 호출 할 때 오류가 발생합니다.

System.Web.Services.Protocols.SoapException: Server was unable to process request. ---> System.InvalidOperationException: There was an error generating the XML document. ---> System.InvalidOperationException: The type was not expected. Use the XmlInclude or SoapInclude attribute to specify types that are not known statically.

내가 추가 [SoapInclude이 (대해서 typeof (MyClass에))]은 차이가 없지만 XmlInclude를 사용 : 이제 (A의 WebMethod를 호출 할 때, 다시) 오류는 다음과 같습니다 다른 클래스, 또 다른 문제가 있습니다 대신 내 ServiceResult.ResultObject 배열을 XmlNodes로 만듭니다.

두 문제 모두 직렬화에 관한 것이지만 문제를 해결하는 방법을 모르겠습니다. 기본적으로, 내 질문입니다 : 어떻게 내가 개체 (내가이 ServiceResult.ResultObject 캐스트 및 캐주얼 인스턴스처럼 캐스팅 싶습니다 그래서 같은 방법으로 webmethod 통해 클라이언트에서 서버에 사용자 지정 개체를 전달해야합니다 그 수업)? 그렇게하는 가장 좋은 방법은 무엇입니까?

누구든지 해결책을 제안 할 수 있습니까?

+2

당신이 .NET 2.0을 사용하여 부착 위치 : 여기

당신이 사용할 수있는 작은 시험 방법입니까? 그렇지 않다면 기존 ASMX 웹 서비스를 사용하지 않아야합니다. 새로운 개발에는 모두 WCF를 사용해야합니다. –

+0

글쎄, 나는 아직 WCF를 사용하지 않았기 때문에 더 쉬울 것이라고 생각했다. 그러나 그것이 더 빠를 수도 있습니다. – msu

+0

기능이 훨씬 적고 확장 성이 훨씬 적기 때문에 "더 쉽습니다."예.좋은 생각은 아닙니다. 미래가 없으며 버그 수정이 없기 때문입니다. –

답변

3

초기 오류 메시지를 기반으로, 직렬화하려고 시도하는 클래스에 Job의 배열 또는 컬렉션 인 속성이있는 것 같아서 예외가 발생할 수 있습니다.

이 등록 정보가 직렬화되지 않아야하는 경우 XmlIgnore 속성으로 꾸밀 수 있습니다.

또한 웹 서비스 직렬화 문제를 디버깅하려고 할 때 일반적으로 XmlSerializer를 사용하여 웹 메서드를 연결하기 전에 웹 서비스 클래스의 인스턴스를 serialize합니다. 때로는 실패한 것에 대한 명시적인 정보를 얻고 직렬화 된 출력을보고 요소가 예상대로 직렬화되지 않을 수있는지를 판별 할 수 있습니다.

/// <summary> 
    /// This method serializes objects to an XML string using the XmlSerializer 
    /// </summary> 
    /// <returns></returns> 
    /// <remarks></remarks> 
    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()); 
     } 
    } 
+0

감사합니다. 유용한 방법입니다. 그러나 나는 여전히 같은 오류가 발생합니다 - 메소드가 항목 Job의 (빈) 배열을 반환하려고 할 때. 두 번째로,이 serializer를 사용하여 private 필드를 얻지 못합니다. – msu

+0

@msu : 항목 배열 : XMLInclude 속성을 사용하여 Job 클래스를 꾸밀 필요가 있다고 생각합니다. 포함될 구체적인 클래스를 각각 지정합니다 (http://www.geekzilla.co.uk/viewA9CF69B4-0C40-4CEE -A590-496D9EB09C0E.htm). re serializer : 웹 서비스에서 개인 필드를 얻지는 않을 것입니다. XMLSerializer로 테스트하는 것이 웹 서비스에서 사용하는 것이기 때문에 중요합니다. 가능한 경우 적어도 .Net 3.5로 업그레이드하고 WCF를 사용하는 것이 좋습니다. –

+0

다시 한 번 감사드립니다. WCF로 업그레이드했지만 여전히 오류가있었습니다. 상속 된 모든 Job 클래스를 [KnownType] 특성에 추가하지 않았기 때문에 다시 돌아 왔습니다. 이제 작동합니다. – msu

관련 문제