我正在尝试将一个简单对象的数组传递给Web服务,并且在编译我的Web客户端项目时我真的陷入了这个错误:
无法将类型'TRIMBrokerUtil.MetaData []'隐式转换为'TRIMBrokerASMXProxy.ASMXProxy.MetaData []'
这是我的“实用程序”项目编译成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;
}
}
}
以下是Web服务的片段,它也编译得很好: 使用TRIMBrokerUtil; 命名空间TRIMBrokerService { [WebService(Namespace =“http://tempuri.org/”)] [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)] [的ToolboxItem(假)] 公共类FileService:System.Web.Services.WebService {
[WebMethod]
public string UploadFile(byte[] incomingArray
, string FileName
, long FileLengthInBytes
, MetaData[] metaDataArray)
{
......以及之后的用法:
Update update = BuildMetaData(metaDataArray);
......而且这个:
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;
}
接下来,(通过“添加Web引用”)我在一个单独的项目中拥有ASMX Web服务的代理类,它编译没有问题。在生成的reference.cs文件中,我发现这似乎没问题:
[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]));
}
现在,对于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 );
我也尝试将上面的最后两行更改为这一行:
strURI = client.UploadFile(binData, fileNameOnly, binData.Length, metaDataArray);
...但是这个改变引入了编译器的第二个错误,该错误读作:
'TRIMBrokerASMXProxy.ASMXProxy.FileService.UploadFile(byte [],string,long,TRIMBrokerASMXProxy.ASMXProxy.MetaData [])'的最佳重载方法匹配有一些无效的参数
(注意关于“无法转换”的原始错误是第二个错误)。
很抱歉上面这么冗长。希望你能帮助解释这种混乱。
答案 0 :(得分:2)
您正尝试将TRIMBrokerUtil.MetaData数组分配给TRIMBrokerASMXProxy.ASMXProxy.MetaData数组。请记住,asp.net代理声明了自己的类型。
只需将数据复制到具有代理类型的新数组中。
答案 1 :(得分:1)
当您添加对Web Service的引用时,Visual Studio将自动为用作Web服务功能的参数的对象生成代码。这是您TRIMBrokerASMXProxy.ASMXProxy.MetaData
课程的来源。
这与您的TRIMBrokerUtil.MetaData
课程不同。您可以从TRIMBrokerUtil
命名空间中删除该类,只需使用Web服务代理中的类。