2010-04-13 2 views
3

내 서버와 웹 서비스에 동일한 클래스가 있습니다. Argument '1': cannot convert from 'System.Collections.Generic.List<Purchase>' to 'localhost.Purchase[]' :<T> 목록을 웹 서비스에 전송할 수 없습니까?

protected void CartRepeater_ItemCommand(object source, RepeaterCommandEventArgs e) 
    { 
     List<Purchase> l = ((List<Purchase>)Session["Cart"]); 

     if (e.CommandName == "Order") 
     { 
      localhost.ValidateService WS = new localhost.ValidateService(); 
      WS.CreateOrder(l, Session["username"].ToString()); 
     } 
    } 

다음과 같은 오류를 제공합니다 : 서버에서 실행되는 다음 코드는, 그러나

[WebMethod] 
     public int CreateOrder(List<Purchase> p, string username) 
     { 
      o.Add(new Order(p,username)); 

      return o.Count; 
     } 

: 나는 다음의 WebMethod 있습니다.

list<Purchase> 개체를 웹 서비스로 전송하려면 어떻게해야합니까?

답변

7

이와 같은 웹 서비스를 사용할 때 기본적으로 List<T>은 배열 (T[])로 변환됩니다. 메서드에 전달하기 전에 .ToArray()을 수행하여 목록을 배열로 변환하십시오.

또 다른 옵션은 배열 대신 목록을 사용하도록 웹 서비스 코드 생성 설정을 변경하는 것입니다.

Purchase이라는 로컬 클래스와 웹 서비스를 통해 생성 된 클래스 (모두 Purchase)도 중복 된 클래스로 보입니다. 이름이 같지만 두 가지 유형 (이름 공간이 다릅니다)입니다. 한 세트의 유형을 고수해야하거나, Automapper과 같은 것을 사용하여 두 세트의 유형을 맵핑해야합니다.

+0

아직 운이 없습니다. 오류 'Argument'1 ':'Purchase [] '에서'localhost.Purchase [] '로 변환 할 수 없습니다. – iTayb

+0

@iTayb'Purchase '!= 'localhost.Purchase' – mxmissile

+0

어떻게 그 중 하나만 사용할 수 있습니까? 그들은 같은 서버에 있지 않습니다. – iTayb

1

웹 서비스가 SOAP을 사용하여 XML 프로토콜 인 데이터를 전송하기 때문입니다. .NET 목록이나 다른 많은 멋진 객체에 대해서는 아무 것도 모릅니다.

귀하의 경우 실제로 배열을 전송하고 있으며 Matti는 이미 단순히 배열을 대신 사용한다고 말한 것으로 나타났습니다.

1

당신은 XML로 목록 <T>를 직렬화 할 수는 <T> 비트는 분명히 잘못된 형식의 XML 태그로 바뀝니다.

목록 <T>을 상속 한 새 개체를 만들 수 있습니다. 그러면이 개체가 잘 직렬화되고 웹 서비스를 거치게됩니다. 이것은 모범 사례 no-nos의 지뢰밭이지만 때로는 손상 될 수 있습니다.

2

svcutil을 사용하여 클라이언트 프록시 클래스를 생성하는 경우 collectionType 옵션을 사용하여 프록시가 기본 배열 이외의 다른 유형을 사용하도록 할 수 있습니다. 이것은 확실히 WCF 서비스에 프록시를 생성하는 데 사용되는 것입니다. ASMX 서비스와 함께 사용된다면 100 % 확신 할 수 없습니다.

어쨌든, 이것은 수행하여 달성된다

svcutil.exe /collectionType:System.Collections.Generic.List`1 [service url] 
0

localohost.ValidateService 클래스에 대한 자신의 네임 스페이스, 프록시 클래스입니다 : 다음 "주문", "localhost.Order"

과 동일하지 않습니다

THER 동일한 웹 서비스 클래스의 다른 메소드에서 호출하는 웹 서비스, 이 시도하는 경우 :

tihs.CreateOrder. (리터를, 세션 [ "이름"] ToString());

관련 문제