急求整改方案,急急急!

时间:2021-07-22 17:15:47
由于深夜还在写代码,所以无法测试.想让大家看看目前的代码 从肉眼的逻辑上看一下 有没有什么一眼发现的问题
代码注释中 带@@@@ 的地方是我拿不准的地方,大家帮忙给看一下
尤其是我webservice的环境部署在网络上.大家帮忙看一下下面代码我疑惑的地方

代码主要完成一个功能,webservice中提供了一个GetExpertData(String xx)函数,此函数根据形参返回一个字符串

环境部署已安装soap sdk3.0  程序编译无问题 但是运行时抛出
this application has requested the runtime to terminate it in an unusual way please contact the application's support team for more information  PS: 这个问题非常严重,究竟是为什么? 麻烦大家帮忙定位一下

StdAfx.h中已添加
//WEB_SERVICE 
#import "msxml4.dll"  
using namespace MSXML2;   
#import "C:\Program Files\Common Files\MSSoap\Binaries\MSSOAP30.dll"exclude("IStream","ISequentialStream","_LARGE_INTEGER","_ULARGE_INTEGER","tagSTATSTG","_FILETIME")   
using namespace MSSOAPLib30;   
//END

代码主要为以下

void SoapTestDlg::OnOK() 
{
ISoapSerializerPtr Serializer;
ISoapReaderPtr Reader;
ISoapConnectorPtr Connector;
CString parmater = "CS201103250001";
//连接service
int i=0;    
HRESULT hr= CoInitialize(NULL);//初始化com环境写了这句下面才不出错

if(FAILED(hr))   
{    
i++; //调试是否初始化成功,若失败大多数可能是没有安装SOAPToolkit3.0 
AfxMessageBox("rrr");

hr=Connector.CreateInstance(__uuidof(HttpConnector30)); 
if(FAILED(hr))
{
i++;//
AfxMessageBox("eeee");
}

Connector->Property["EndPointURL"] = "http://61.156.8.197:8082/ExpertService.asmx";  //WebService的地址

//写了上句这句不出错服务所在地址和端口
Connector->Connect();

Connector->Property["SoapAction"] = "http://tempuri.org/GetExpertData"; // @@@@这里应该如何填写? or http://61.156.8.197:8082/ExpertService.asmx/GetExpertData or http://61.156.8.197:8082/GetExpertData
Connector->BeginMessage();
Serializer.CreateInstance(__uuidof(SoapSerializer30));
Serializer->Init(_variant_t((IUnknown*)Connector->InputStream));
Serializer->StartEnvelope("","","");//1 
Serializer->EndEnvelope();

Serializer->StartBody("");
Serializer->StartElement("GetExpertData","http://tempuri.org/","NONE",""); // 4 @@@@ //这里应该如何填写?


Serializer->StartElement("parmater","http://tempuri.org/","NONE","");
Serializer->WriteString(_bstr_t(parmater));
Serializer->EndElement();

Serializer->EndElement();
Serializer->EndBody();
    Serializer->EndEnvelope();


    Connector->EndMessage(); 
      
    Reader.CreateInstance(__uuidof(SoapReader30));
   
    Reader->Load(_variant_t((IUnknown*)Connector->OutputStream), "");
     
    AfxMessageBox((const char*)Reader->RpcResult->text);// 显示收到的结果

CDialog::OnOK();

}

13 个解决方案

#1


该回复于2011-03-29 08:36:54被版主删除

#2


该回复于2011-03-29 09:11:20被版主删除

#3


该回复于2011-03-29 09:11:20被版主删除

#4


  ...别帮顶....  很急。。。急的我睡不着觉。。

#5


引用 4 楼 manytao 的回复:
...别帮顶.... 很急。。。急的我睡不着觉。。


理解你的心情、、、、、、

要是知道的早就告诉你了,楼主可以找下 论坛那些大牛们和版主们,他们这些前辈应该很懂的

#6


  现在调通了.. 问题是返回值又有问题..看来还是要自己攻克一下. 我在把进一步得到的结果共享给大家,大家可以一起来发表意见并探讨。

我查看了一下webservice上的xml 请求和相应信息


POST /ExpertService.asmx HTTP/1.1
Host: 61.156.8.197
Content-Type: text/xml; charset=utf-8
Content-Length: length
SOAPAction: "http://localhost/GetExpertData"

<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
  <soap:Body>
    <GetExpertData xmlns="http://localhost/">
      <RegistrationNo>string</RegistrationNo>
    </GetExpertData>
  </soap:Body>
</soap:Envelope>



HTTP/1.1 200 OK
Content-Type: text/xml; charset=utf-8
Content-Length: length

<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
  <soap:Body>
    <GetExpertDataResponse xmlns="http://localhost/">
      <GetExpertDataResult>string</GetExpertDataResult>
    </GetExpertDataResponse>
  </soap:Body>
</soap:Envelope>

由此得知,传入一个字符串,服务器返回的也是一个字符串

代码已更新如下

[code=C/C++]
void SoapTestDlg::OnOK() 
{
ISoapSerializerPtr Serializer;
ISoapReaderPtr Reader;
ISoapConnectorPtr Connector;
//连接service
int i=0;    
HRESULT hr= CoInitialize(NULL);//初始化com环境写了这句下面才不出错

if(FAILED(hr))   
{    
i++; //调试是否初始化成功,若失败大多数可能是没有安装SOAPToolkit3.0 
AfxMessageBox("rrr");

hr=Connector.CreateInstance(__uuidof(HttpConnector30)); 
if(FAILED(hr))
{
i++;//
AfxMessageBox("eeee");
}

Connector->Property["EndPointURL"] = "http://61.156.8.197:8082/ExpertService.asmx";

//写了上句这句不出错服务所在地址和端口
Connector->Connect();

Connector->Property["SoapAction"] = "http://61.156.8.197:8082/GetExpertData"; // or http://61.156.8.197:8082/ExpertService.asmx/GetExpertData or http://61.156.8.197:8082/GetExpertData
Connector->BeginMessage();
Serializer.CreateInstance(__uuidof(SoapSerializer30));
Serializer->Init(_variant_t((IUnknown*)Connector->InputStream));


Serializer->StartEnvelope("soap","","");//1 
Serializer->StartBody("");
Serializer->StartElement("GetExpertData","http://61.156.8.197:8082/","","soap"); // 4 
Serializer->StartElement("RegistrationNo","","","soap"); // 4 
Serializer->WriteString("CS201103250001");
Serializer->EndElement();
Serializer->EndElement();
Serializer->EndBody();
    Serializer->EndEnvelope();


    Connector->EndMessage(); 
      
    Reader.CreateInstance(__uuidof(SoapReader30));
   
    Reader->Load(_variant_t((IUnknown*)Connector->OutputStream), "");
     
    AfxMessageBox((const char*)Reader->RpcResult->text);// 显示收到的结果

CDialog::OnOK();

}

但是目前返回的结果却是.... soap-client 。。。。 并不是真正从服务器返回的值..不过侧面说明已经调通了,大家看看 还有什么我没考虑到的。

[/code]

#7


调通了就好啊,恭喜啊,以后遇到这问题就可以参考下楼主这帖子了

#8


...问题有可能是这里。。。

三个对象刚开始就有错误....

[img=http://hi.csdn.net/space-4965080-do-album-picid-638987-goto-up.html][/img]

#9


急求整改方案,急急急!

#10


引用 9 楼 manytao 的回复:

刚开始没关系,关键是你后面创建对象实例等的时候,是否成功,然后自己单步调试

#11


下面是SOAP Toolkit 3.0上的示例用法,绝大部分WebService都能访问成功,当然有些不怎么标准的也访问不了(我就遇到过人家的WebService服务器上面那个编码是utf-8;我用soap Toolkit生成的是"uft-8",多了个引号,结果服务器死活说编码有问题,拒绝解析我的报文)你需要分析你的WebService的wsdl文件。

Creating the Client-Side C++ Code
To create the DocSample2 low-level C++ client application 

1.Open Microsoft® Visual C++ 6.0. 
2.On the File menu, select New. 
3.Click on the Projects tab, select Win32 Console Application, and, in the Project Name box, enter DocSample2. Click OK. 
To add a C++ source file to the DocSample2 application 

1.On the File menu, select New. 
2.On the Files tab, select C++ Source File and enter a file name. Click OK. 
3.Add the following code to this source file. 

#include <stdio.h>
#import "msxml4.dll" 
using namespace MSXML2;
#import "C:\Program Files\Common Files\MSSoap\Binaries\mssoap30.dll" \
            exclude("IStream", "IErrorInfo", "ISequentialStream", "_LARGE_INTEGER", \
                    "_ULARGE_INTEGER", "tagSTATSTG", "_FILETIME")
using namespace MSSOAPLib30;
void Add()
{
   ISoapSerializerPtr Serializer;
   ISoapReaderPtr Reader;
   ISoapConnectorPtr Connector;
   // Connect to the service.
   Connector.CreateInstance(__uuidof(HttpConnector30));
   Connector->Property["EndPointURL"] = "http://MyServer/Soap3DocSamples/DocSample1/Server/DocSample1.wsdl";
   Connector->Connect();

   // Begin the message.
   //Connector->Property["SoapAction"] = "uri:AddNumbers";
   Connector->Property["SoapAction"] = "http://tempuri.org/DocSample1/action/Sample1.AddNumbers";
   Connector->BeginMessage();

   // Create the SoapSerializer object.
   Serializer.CreateInstance(__uuidof(SoapSerializer30));

   // Connect the serializer object to the input stream of the connector object.
   Serializer->Init(_variant_t((IUnknown*)Connector->InputStream));

   // Build the SOAP Message.
   Serializer->StartEnvelope("","","");
   Serializer->StartBody("");
   Serializer->StartElement("AddNumbers","http://tempuri.org/DocSample1/message/","","");
   Serializer->StartElement("NumberOne","","","");
   Serializer->WriteString("5");
   Serializer->EndElement();
   Serializer->StartElement("NumberTwo","","","");
   Serializer->WriteString("10");
   Serializer->EndElement();
   Serializer->EndElement();
   Serializer->EndBody();
   Serializer->EndEnvelope();
   
   // Send the message to the XML Web service.
   Connector->EndMessage();      

   // Read the response.
   Reader.CreateInstance(__uuidof(SoapReader30));

   // Connect the reader to the output stream of the connector object.
   Reader->Load(_variant_t((IUnknown*)Connector->OutputStream), "");

   // Display the result.
   printf("Answer: %s\n", (const char*)Reader->RpcResult->text);
    
}

int main()
{
   CoInitialize(NULL);
   Add();
   CoUninitialize();
   return 0;
}


4.Update the value of the EndPointURL property. Specify your server name in the URL. 
5.Build and run the application. 

最后,我建议你用gSoap,使用方便,调试简单

#12


楼主,我用atl写过webservice,感觉方便使用。并且提供了内存池,数据库池等功能。

#13


  哈哈 搞定了!  原来是他娘的WebService没定义soap的类  妈的!  谢谢大家乐。 晚上结贴。现在睡觉了

#1


该回复于2011-03-29 08:36:54被版主删除

#2


该回复于2011-03-29 09:11:20被版主删除

#3


该回复于2011-03-29 09:11:20被版主删除

#4


  ...别帮顶....  很急。。。急的我睡不着觉。。

#5


引用 4 楼 manytao 的回复:
...别帮顶.... 很急。。。急的我睡不着觉。。


理解你的心情、、、、、、

要是知道的早就告诉你了,楼主可以找下 论坛那些大牛们和版主们,他们这些前辈应该很懂的

#6


  现在调通了.. 问题是返回值又有问题..看来还是要自己攻克一下. 我在把进一步得到的结果共享给大家,大家可以一起来发表意见并探讨。

我查看了一下webservice上的xml 请求和相应信息


POST /ExpertService.asmx HTTP/1.1
Host: 61.156.8.197
Content-Type: text/xml; charset=utf-8
Content-Length: length
SOAPAction: "http://localhost/GetExpertData"

<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
  <soap:Body>
    <GetExpertData xmlns="http://localhost/">
      <RegistrationNo>string</RegistrationNo>
    </GetExpertData>
  </soap:Body>
</soap:Envelope>



HTTP/1.1 200 OK
Content-Type: text/xml; charset=utf-8
Content-Length: length

<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
  <soap:Body>
    <GetExpertDataResponse xmlns="http://localhost/">
      <GetExpertDataResult>string</GetExpertDataResult>
    </GetExpertDataResponse>
  </soap:Body>
</soap:Envelope>

由此得知,传入一个字符串,服务器返回的也是一个字符串

代码已更新如下

[code=C/C++]
void SoapTestDlg::OnOK() 
{
ISoapSerializerPtr Serializer;
ISoapReaderPtr Reader;
ISoapConnectorPtr Connector;
//连接service
int i=0;    
HRESULT hr= CoInitialize(NULL);//初始化com环境写了这句下面才不出错

if(FAILED(hr))   
{    
i++; //调试是否初始化成功,若失败大多数可能是没有安装SOAPToolkit3.0 
AfxMessageBox("rrr");

hr=Connector.CreateInstance(__uuidof(HttpConnector30)); 
if(FAILED(hr))
{
i++;//
AfxMessageBox("eeee");
}

Connector->Property["EndPointURL"] = "http://61.156.8.197:8082/ExpertService.asmx";

//写了上句这句不出错服务所在地址和端口
Connector->Connect();

Connector->Property["SoapAction"] = "http://61.156.8.197:8082/GetExpertData"; // or http://61.156.8.197:8082/ExpertService.asmx/GetExpertData or http://61.156.8.197:8082/GetExpertData
Connector->BeginMessage();
Serializer.CreateInstance(__uuidof(SoapSerializer30));
Serializer->Init(_variant_t((IUnknown*)Connector->InputStream));


Serializer->StartEnvelope("soap","","");//1 
Serializer->StartBody("");
Serializer->StartElement("GetExpertData","http://61.156.8.197:8082/","","soap"); // 4 
Serializer->StartElement("RegistrationNo","","","soap"); // 4 
Serializer->WriteString("CS201103250001");
Serializer->EndElement();
Serializer->EndElement();
Serializer->EndBody();
    Serializer->EndEnvelope();


    Connector->EndMessage(); 
      
    Reader.CreateInstance(__uuidof(SoapReader30));
   
    Reader->Load(_variant_t((IUnknown*)Connector->OutputStream), "");
     
    AfxMessageBox((const char*)Reader->RpcResult->text);// 显示收到的结果

CDialog::OnOK();

}

但是目前返回的结果却是.... soap-client 。。。。 并不是真正从服务器返回的值..不过侧面说明已经调通了,大家看看 还有什么我没考虑到的。

[/code]

#7


调通了就好啊,恭喜啊,以后遇到这问题就可以参考下楼主这帖子了

#8


...问题有可能是这里。。。

三个对象刚开始就有错误....

[img=http://hi.csdn.net/space-4965080-do-album-picid-638987-goto-up.html][/img]

#9


急求整改方案,急急急!

#10


引用 9 楼 manytao 的回复:

刚开始没关系,关键是你后面创建对象实例等的时候,是否成功,然后自己单步调试

#11


下面是SOAP Toolkit 3.0上的示例用法,绝大部分WebService都能访问成功,当然有些不怎么标准的也访问不了(我就遇到过人家的WebService服务器上面那个编码是utf-8;我用soap Toolkit生成的是"uft-8",多了个引号,结果服务器死活说编码有问题,拒绝解析我的报文)你需要分析你的WebService的wsdl文件。

Creating the Client-Side C++ Code
To create the DocSample2 low-level C++ client application 

1.Open Microsoft® Visual C++ 6.0. 
2.On the File menu, select New. 
3.Click on the Projects tab, select Win32 Console Application, and, in the Project Name box, enter DocSample2. Click OK. 
To add a C++ source file to the DocSample2 application 

1.On the File menu, select New. 
2.On the Files tab, select C++ Source File and enter a file name. Click OK. 
3.Add the following code to this source file. 

#include <stdio.h>
#import "msxml4.dll" 
using namespace MSXML2;
#import "C:\Program Files\Common Files\MSSoap\Binaries\mssoap30.dll" \
            exclude("IStream", "IErrorInfo", "ISequentialStream", "_LARGE_INTEGER", \
                    "_ULARGE_INTEGER", "tagSTATSTG", "_FILETIME")
using namespace MSSOAPLib30;
void Add()
{
   ISoapSerializerPtr Serializer;
   ISoapReaderPtr Reader;
   ISoapConnectorPtr Connector;
   // Connect to the service.
   Connector.CreateInstance(__uuidof(HttpConnector30));
   Connector->Property["EndPointURL"] = "http://MyServer/Soap3DocSamples/DocSample1/Server/DocSample1.wsdl";
   Connector->Connect();

   // Begin the message.
   //Connector->Property["SoapAction"] = "uri:AddNumbers";
   Connector->Property["SoapAction"] = "http://tempuri.org/DocSample1/action/Sample1.AddNumbers";
   Connector->BeginMessage();

   // Create the SoapSerializer object.
   Serializer.CreateInstance(__uuidof(SoapSerializer30));

   // Connect the serializer object to the input stream of the connector object.
   Serializer->Init(_variant_t((IUnknown*)Connector->InputStream));

   // Build the SOAP Message.
   Serializer->StartEnvelope("","","");
   Serializer->StartBody("");
   Serializer->StartElement("AddNumbers","http://tempuri.org/DocSample1/message/","","");
   Serializer->StartElement("NumberOne","","","");
   Serializer->WriteString("5");
   Serializer->EndElement();
   Serializer->StartElement("NumberTwo","","","");
   Serializer->WriteString("10");
   Serializer->EndElement();
   Serializer->EndElement();
   Serializer->EndBody();
   Serializer->EndEnvelope();
   
   // Send the message to the XML Web service.
   Connector->EndMessage();      

   // Read the response.
   Reader.CreateInstance(__uuidof(SoapReader30));

   // Connect the reader to the output stream of the connector object.
   Reader->Load(_variant_t((IUnknown*)Connector->OutputStream), "");

   // Display the result.
   printf("Answer: %s\n", (const char*)Reader->RpcResult->text);
    
}

int main()
{
   CoInitialize(NULL);
   Add();
   CoUninitialize();
   return 0;
}


4.Update the value of the EndPointURL property. Specify your server name in the URL. 
5.Build and run the application. 

最后,我建议你用gSoap,使用方便,调试简单

#12


楼主,我用atl写过webservice,感觉方便使用。并且提供了内存池,数据库池等功能。

#13


  哈哈 搞定了!  原来是他娘的WebService没定义soap的类  妈的!  谢谢大家乐。 晚上结贴。现在睡觉了