Domanda

Sto cercando di passare un array di un oggetto semplice a un servizio Web e sono davvero bloccato su questo errore durante la compilazione del mio progetto client Web:

Impossibile convertire implicitamente il tipo 'TRIMBrokerUtil.MetaData []' a 'TRIMBrokerASMXProxy.ASMXProxy.MetaData []'

Ecco il mio progetto "utility" compilato in TRIMBrokerUtil.dll:

namespace TRIMBrokerUtil
{
    public class MetaData
    {
    protected string _Name;
    protected string _Value;
    public MetaData(string keyword, string setting) 
    {
        this.Name = keyword;
        this.Value = setting;
    }
    public string Name
    {
        get
        {
        return this._Name;
        }
        set
        {
        Name = value;
        }
    }
    public string Value
    {
        get
        {
        return this._Value;
        }
        set
        {
        _Value = value;
        }
    }
    }
:

Ecco un frammento del servizio web che compila anche bene:     utilizzando TRIMBrokerUtil;     namespace TRIMBrokerService     {         [WebService (Namespace = " http://tempuri.org/ ")]         [WebServiceBinding (ConformsTo = WsiProfiles.BasicProfile1_1)]         [ToolboxItem (false)]         Classe FileService pubblica: System.Web.Services.WebService         {

    [WebMethod]
    public string UploadFile(byte[] incomingArray
        , string FileName
        , long FileLengthInBytes
        , MetaData[] metaDataArray)
    {

... e l'uso più tardi come questo:

Update update = BuildMetaData(metaDataArray);

... e questo:

private Update BuildMetaData(MetaData[] nvPairs)
{
    Update update = new Update();
    InputProperty[] ip = new InputProperty[nvPairs.Length];
    int i;
    for (i=0; i < nvPairs.Length; i++)
    {
    ip[i].Name = "udf:" + nvPairs[i].Name;
    ip[i].Val = nvPairs[i].Value;
    }
    update.Items = ip;
    return update;
}

Avanti, (tramite "Aggiungi riferimento Web") ho la mia classe proxy per il webservice ASMX in un progetto separato e compila senza problemi. All'interno del file generato Reference.cs Trovo questo che sembra OK:

    [System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://tempuri.org/UploadFile", RequestNamespace="http://tempuri.org/", ResponseNamespace="http://tempuri.org/", Use=System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle=System.Web.Services.Protocols.SoapParameterStyle.Wrapped)]
    public string UploadFile([System.Xml.Serialization.XmlElementAttribute(DataType="base64Binary")] byte[] incomingArray, string FileName, long FileLengthInBytes, MetaData[] metaDataArray) {
        object[] results = this.Invoke("UploadFile", new object[] {
                    incomingArray,
                    FileName,
                    FileLengthInBytes,
                    metaDataArray});
        return ((string)(results[0]));
    }

Ora per l'errore che si verifica nella compilation nel progetto web client (default.aspx.cs):

    using TRIMBrokerUtil;

public partial class _Default : System.Web.UI.Page
{
    private void UploadFile(HttpPostedFile postedFile
                , string fileNameOnly
                , MetaData[] metaDataArray)
    {
        string strURI = string.Empty;
        TRIMBrokerASMXProxy.ASMXProxy.FileService client = new TRIMBrokerASMXProxy.ASMXProxy.FileService();
        BinaryReader b = new BinaryReader(postedFile.InputStream);
        byte[] binData = b.ReadBytes(numBytes);
        TRIMBrokerASMXProxy.ASMXProxy.MetaData[] kvData = metaDataArray; // error complains about this line
        strURI = client.UploadFile(binData, fileNameOnly, binData.Length, kvData );

Inoltre ho provato a cambiare le ultime 2 righe sopra semplicemente questa linea:

strURI = client.UploadFile(binData, fileNameOnly, binData.Length, metaDataArray);

... ma che il cambiamento introduce un secondo di errore del compilatore che si legge come:

La partita miglior metodo di overload per 'TRIMBrokerASMXProxy.ASMXProxy.FileService.UploadFile (byte [], string, lungo, TRIMBrokerASMXProxy.ASMXProxy.MetaData [])' ha alcuni argomenti non validi

(notare l'errore originale di "impossibile convertire" è il secondo errore).

Mi dispiace per essere così dettagliato sopra. Spero che tu possa aiutare a far luce su questa confusione.

È stato utile?

Soluzione

Si sta tentando di assegnare una matrice di TRIMBrokerUtil.MetaData ad una serie di TRIMBrokerASMXProxy.ASMXProxy.MetaData. Ricordate che il proxy asp.net dichiara il suo tipo.

Basta copiare i dati in un nuovo array con il tipo di proxy.

Altri suggerimenti

Quando si aggiunge un riferimento al servizio Web, Visual Studio genera automaticamente il codice per gli oggetti che vengono utilizzati come parametri per le funzioni del servizio web. Questo è dove la classe TRIMBrokerASMXProxy.ASMXProxy.MetaData proviene.

Questo non è lo stesso del vostro TRIMBrokerUtil.MetaData di classe. È possibile rimuovere la classe dalla TRIMBrokerUtil spazio dei nomi e basta usare quello del proxy del servizio Web invece.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top