2012-02-08 6 views
1

jQuery ajax를 사용하여 ASP.Net 웹 서비스 (ASMX 파일)를 호출하여 웹 페이지 데이터를 업데이트합니다.일반 형식 정의를 asmx webservice에 전달하는 방법

내가 도메인 객체 클래스 코드에서 데이터베이스 기억 별도의 코드가 (아래 예 코드를 동물 클래스 및 AnimalRepository 클래스가있다). 나는 모든 유사한 도메인 객체 저장소 클래스가 Store 메소드를 가질 것이라는 규칙을 구현 중이다.

나는이 저장소 클래스 중 하나의 저장 방법을 호출하기위한 수용 할 수있는 웹 서비스를 생성하고 싶습니다. 이를 작동 시키려면 아래 코드 샘플에서 List of Of Animal 매개 변수가 제네릭 형식이어야합니다.

나는 (객체) 목록을 시도했지만 형식을 변환 할 수 없습니다에 저장 명령 오류. 런타임까지 알 수 없기 때문에 List (Of Object)를 올바른 유형으로 캐스팅 할 수 있다고는 생각하지 않습니다.

<WebMethod(True)> _ 
Public Sub StoreAnimals(ByVal _animals As List(Of Animal), ByVal _type As String) 
    Dim classType As Type = Type.GetType(_type & "Repository, MyCompany.Assembly") 
    Dim instanceOfClass = Activator.CreateInstance(classType) 
    Dim method As MethodInfo = classType.GetMethod("Store") 
    method.Invoke(instanceOfClass, New Object() {_animals}) 
End Sub 

이상적으로, 내가 좋아하는 것 다음 웹 서비스 메소드 정의에서 제네릭의 여지가 없다,하지만 같은 최종 결과를 달성 할 수있는 트릭이

<WebMethod(True)> _ 
Public Sub StoreData(Of T)(ByVal _data As List(Of T), ByVal _type As String) 
    Dim classType As Type = Type.GetType(_type & "Repository, MyCompany.Assembly") 
    Dim instanceOfClass = Activator.CreateInstance(classType) 
    Dim method As MethodInfo = classType.GetMethod("Store") 
    method.Invoke(instanceOfClass, New Object() {_data}) 
End Sub 

. 그렇지 않으면 첫 번째 매개 변수에서만 다른 많은 Store * 웹 서비스를 만들 예정입니다.

답변

2

제네릭이 웹 서비스 세계에서는 의미가 없습니다.

당신은 ASMX와 함께 어느 곳이에 가까운 올 수 없습니다. WCF를 사용하면 무언가를 할 수는 있지만 작업 계약에서 열린 제네릭 형식을 사용할 수는 없습니다.

+0

대단한 직업 - 적어도 나는 죽은 말을 때리는 데 더 이상 시간을 낭비하지 않을 것입니다. –

1

당신은 당신이 어레이 및 역 직렬화하는 대신 바이트 배열에서 개체를 바이트 (동물의) 목록을 직렬화 수있는 기대 객체의 유형을 알고있는 경우.

VB.NET에서 작은 샘플을 만들었지 만 번역 할 수 있다고 생각합니다. 웹 서비스와 클라이언트가 공유하는 클래스를 만들었습니다.

클라이언트 코드

Imports System.Xml.Serialization 
Imports SharedLibrary 

Public Class Form1 

Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load 
    Dim client As New ServiceReference1.WebServiceSoapClient 

    Dim a As New Animal 
    a.Name = "Pooh" 
    MessageBox.Show(client.SendObject(XmlSerialize(a), ServiceReference1.ObjectT.Animal)) 

    Dim v As New Vehicle 
    v.Name = "Volvo" 
    MessageBox.Show(client.SendObject(XmlSerialize(v), ServiceReference1.ObjectT.Vehicle)) 
End Sub 

Public Shared Function XmlSerialize(ByVal serializableObject As Object) As Byte() 
    Dim serializer As XmlSerializer = New XmlSerializer(serializableObject.GetType()) 
    Dim aMemStr As New System.IO.MemoryStream 

    Dim writer As System.Xml.XmlWriter = System.Xml.XmlWriter.Create(aMemStr) 

    serializer.Serialize(writer, serializableObject) 
    writer.Close() 
    aMemStr.Close() 
    Return aMemStr.ToArray() 
End Function 

공유 라이브러리

Public Class ObjectTypes 
    Public Enum ObjectT 
    Animal 
    Vehicle 
    End Enum 
    End Class 

    Public Class Animal 
Private strName As String 

Public Property Name As String 
    Get 
     Return strName 
    End Get 
    Set(value As String) 
     strName = value 
    End Set 
End Property 
End Class 

Public Class Vehicle 

Private strName As String 

Public Property Name As String 
    Get 
     Return strName 
    End Get 
    Set(value As String) 
     strName = value 
    End Set 
End Property 
End Class 

웹 서비스

<WebMethod()> _ 
Public Function SendObject(bytObject As Byte(), objType As SharedLibrary.ObjectTypes.ObjectT) As String 
    Try 
     Select Case objType 
      Case ObjectTypes.ObjectT.Animal 
       Dim myAnimal As Animal = XmlDeSerialize(bytObject, GetType(Animal)) 
       Return "I received an animal with name: " & myAnimal.Name 
      Case ObjectTypes.ObjectT.Vehicle 
       Dim myVehicle As Vehicle = XmlDeSerialize(bytObject, GetType(Vehicle)) 
       Return "I received a vehicle with name: " & myVehicle.Name 
     End Select 
    Catch ex As Exception 
     Return "Something went wrong: " & ex.Message 
    End Try 

    Return "I did not receive anything :(" 

End Function 

Public Shared Function XmlDeSerialize(ByVal xmlbytearr As Byte(), ByVal objectType As Type) As Object 
    Dim serializer As XmlSerializer = New XmlSerializer(objectType) 
    Dim aStream As System.IO.MemoryStream = New System.IO.MemoryStream(xmlbytearr) 

    Return serializer.Deserialize(aStream) 
End Function 
+0

개체 유형은 여러 가지 중 하나 일 수 있습니다. Animal in List (Of Animal)은 하나의 웹 페이지에서 List Of (Of User)를 요구하는 사용자 일 수 있으며, BankTransaction은 List (Of BankTransaction)을 다른 사용자에게 요구합니다. 웹 서비스가 클라이언트에 의해 호출 될 때까지 정확한 유형을 알지 못합니다. 그게 당신의 대답에 영향을 미칩니 까? 전체 바이트 배열에 대해 잘 모르겠습니다. 그리고 그것을 조사하고 테스트해야 할 것입니다. 빠른 코드 샘플을 제공 할 수 있습니까? –

+0

이 개체를 역 직렬화하는 방법을 알려주는 enum 일 수있는 다른 매개 변수를 전달해야 할 것입니다. 예를 들어 Enum.AnimalList를 제공하면 바이트를 Animal 목록에 역 직렬화해야 함을 알 수 있습니다. Animal이 웹 서버와 호출자 클라이언트 모두에 존재하도록 모든 정의가있는 동일한 유형의 라이브러리를 공유해야합니다. 문자열을 사용 했으므로 제대로 작동 할 수 있습니다. – serializer

+0

해결 방법에 대한 몇 가지 코드 예를 사용하여 답변을 업데이트했습니다. – serializer

관련 문제