对WebService和WSDL比较了解的进来帮助一下
场景:
有两线上网站A和调,其中A调用B提供的WebService服务.
因为某种原因,B不能继续提供服务.
要求:现要求用一服务来完全替代B提供的服务.
限制:A网站不能动,除了配置文件中的WebService地址可变化,其它不能有什么何变化.
可用资源:
1.一个A的本地源代码,已确定和线上A网站运行版本不一致,其中有一个调用B服务生成的本地代理和1个WSDL文件
2.一个线上的A网站COPY(发布版本,非源代码,可反编译,未混淆,可在本地WebServer运行)
已尝试:使用Wsdl.exe 对wsdl文件生成服务器端代码(接口),并实现.提供服务.
在使用Wsdl有一个error(具体请Wsdl.exe /si "path")
把本地A网站配置到新地址,debug可以发现,能够调入到新的服务并正确执行,也能返回结果,
但是在A接收到NULL.
在 代理类中方法中: object[] results = this.Invoke("method", new object[]{in0,in1});
results为Null,但是服务端已输出了结果(debug可知,或直接测试服务也可知)
已检查:服务器生成的接口和实现的XML特性的namespace和反编译(线上A)的代理的XML的namespace.
请大家畅所欲言,有能帮助者至少200分,QQ282092961
附:WSDL
[解决办法]
不太明白这句话的意思:
在 代理类中方法中: object[] results = this.Invoke("method", new object[]{in0,in1});
results为Null,但是服务端已输出了结果(debug可知,或直接测试服务也可知)
用工具直接生成的代理类,注意nillable="true"表示该字段为可空类型
[XmlElement(IsNullable = true)]
[解决办法]
另外可以尝试第三方的工具,比如SoapUI 4.0,代码类别选择C#
[解决办法]
又看了一下你的帖子,那么目前可以确定的是,你的代理类是没有问题的
调到了服务,并且服务端返回了数据,并不代理服务端返回的数据(XML)结构是代理能够正确解析的
建议:将你生成的服务WSDL和你之前的WSDL用代码对比工具进行差异对比(肉眼估计会累死你)
[解决办法]
并不代表服务端返回的数据(XML)结构是代理能够正确解析的
[解决办法]
既然你可以反编译,那么拿出A的有关服务客户端代理里边的代码,是数据的class就用数据的class,是功能调用的class就把它有关
:System.ServiceModel.ClientBase<W>,....父类声明删掉,再把几个实例化方法删掉,剩下功能调用的声明代码。
public class Weather
{
public RespInfo updateWeatherInfo(InfoHeader in0, WeatherInfoBean in1)
{
throw new NotImplementedException();
}
public RespInfo2someListMap findWeatherInfoList(InfoHeader in0, NetWorkConditions in1)
{
throw new NotImplementedException();
}
public RespInfo addWeatherInfo(InfoHeader in0, WeatherInfoBean in1)
{
throw new NotImplementedException();
}
}
public partial class WeatherInfoBean
{
public string agriTips{get;set;}
public string cdbId{get;set;}
public string cpId{get;set;}
public string day{get;set;}
public string forecastDate{get;set;}
public string humidity{get;set;}
public string pubDate{get;set;}
public string recordStatus{get;set;}
public string region{get;set;}
public string source{get;set;}
public string status{get;set;}
public string temperature{get;set;}
public string weather{get;set;}
public string windDirection{get;set;}
public string windSpeed{get;set;}
}