Pergunta

Eu estou tentando passar uma matriz de um objeto simples de um serviço web e eu estou realmente preso sobre este erro durante a compilação do meu projeto cliente web:

Não é possível converter implicitamente tipo 'TRIMBrokerUtil.MetaData []' para 'TRIMBrokerASMXProxy.ASMXProxy.MetaData []'

Aqui está o meu projeto "utilidade" compilado em 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;
        }
    }
    }

Aqui está um trecho do serviço web que também compila bem: usando TRIMBrokerUtil; namespace TRIMBrokerService { [WebService (Namespace = " http://tempuri.org/ ")] [WebServiceBinding (ConformsTo = WsiProfiles.BasicProfile1_1)] [ToolboxItem (falso)] FileService classe pública: System.Web.Services.WebService {

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

... e uso mais tarde como esta:

Update update = BuildMetaData(metaDataArray);

... e isso:

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;
}

A seguir, (via "Add Web Reference") Eu tenho minha classe de proxy para o webservice ASMX em um projeto separado e compila sem problema. Dentro arquivo Reference.cs gerados Acho isso que parece 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]));
    }

Agora, para o erro que ocorre na compilação no projeto cliente web (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 );

Eu também tentei mudar as 2 últimas linhas acima para simplesmente esta linha um:

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

... mas essa mudança introduz um segundo erro do compilador que lê como:

A melhor correspondência método sobrecarregado para 'TRIMBrokerASMXProxy.ASMXProxy.FileService.UploadFile (byte [], corda, longo, TRIMBrokerASMXProxy.ASMXProxy.MetaData [])' tem alguns argumentos inválidos

(note o erro original sobre "não pode converter" é o 2º erro).

Desculpe por ser tão detalhado acima. Espero que possa ajudar a lançar luz sobre esta confusão.

Foi útil?

Solução

Você está tentando atribuir uma matriz de TRIMBrokerUtil.MetaData a uma matriz de TRIMBrokerASMXProxy.ASMXProxy.MetaData. Lembre-se que o proxy asp.net declara seu próprio tipo.

copiar

Apenas os dados em uma nova matriz com o tipo de proxy.

Outras dicas

Quando você adicionar uma referência para o serviço Web, Visual Studio irá gerar automaticamente o código para os objetos que são usados ??como parâmetros para as funções do serviço de web. Este é o lugar onde sua classe TRIMBrokerASMXProxy.ASMXProxy.MetaData vem.

Isto não é o mesmo que sua classe TRIMBrokerUtil.MetaData. Você pode remover a classe do seu namespace TRIMBrokerUtil e usar apenas a partir do proxy de serviço da web em seu lugar.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top