C# 객체 배열 및 암시 적 유형 변환에 혼동
-
21-08-2019 - |
문제
나는 단순한 객체를 웹 서비스에 전달하려고 노력하고 있으며 웹 클라이언트 프로젝트를 컴파일하는 동안이 오류에 실제로 붙어 있습니다.
'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;
}
}
}
다음은 웹 서비스의 스 니펫이 있습니다. 네임 스페이스 트림 브로커 서비스 {[Webservice (네임 스페이스 = "http://tempuri.org/")] [WebServiceBinding (conformsto = wsiprofiles.basicprofile1_1)] [ToolboxItem (false)] public class 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;
}
다음으로 ( "웹 참조 추가"를 통해) 별도의 프로젝트에 ASMX 웹 서비스에 대한 프록시 클래스가 있으며 문제없이 컴파일합니다. 생성 된 참조.
[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]));
}
이제 웹 클라이언트 프로젝트 (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 );
또한 위의 마지막 2 줄을 단순히이 한 줄로 변경하려고 시도했습니다.
strURI = client.UploadFile(binData, fileNameOnly, binData.Length, metaDataArray);
... 그러나 그 변경은 다음과 같이 읽는 컴파일러의 두 번째 오류를 도입합니다.
'trimbrokerasmxproxy.asmxproxy.fileservice.uploadfile (byte [], string, long, trimbrokerasmxproxy.asmxproxy.metadata [])에 대한 가장 잘로드 된 메소드 일치에는 몇 가지 잘못된 인수가 있습니다.
( "변환 할 수 없음"에 대한 원래 오류는 두 번째 오류입니다).
위의 장황에 대해 죄송합니다. 이 혼란에 빛을 비추도록 도울 수 있기를 바랍니다.
해결책
TrimBrokerAsmxproxy.asmxproxy.metadata의 배열에 TrimbrokerUtil.metadata 배열을 할당하려고합니다. ASP.NET 프록시는 자체 유형을 선언합니다.
프록시 유형의 새 배열에 데이터를 복사하기 만하면됩니다.
다른 팁
웹 서비스에 대한 참조를 추가하면 Visual Studio는 웹 서비스의 기능에 대한 매개 변수로 사용되는 객체에 대한 코드를 자동으로 생성합니다. 이것은 당신의 곳입니다 TRIMBrokerASMXProxy.ASMXProxy.MetaData
수업은
이것은 당신과 동일하지 않습니다 TRIMBrokerUtil.MetaData
수업. 당신은 당신의 클래스를 제거 할 수 있습니다 TRIMBrokerUtil
네임 스페이스를 대신 웹 서비스 프록시에서 사용하십시오.