.net webservice 无法识别请求元素

qqhahazxxqq 2015-01-27 12:42:50
问题描述请看下面这篇博客提到的问题
http://blog.csdn.net/dragontang/article/details/4150946
博客中已经给出了可以通过java客户端的调用代码来解决此问题
但是我是SP角色,对给了一个接口规范给我做数据同步,我现在用.net写的webservice,我没有办法要求对方更改他们的代码。
想请问的能不能通过更改我的接口方法解决这个问题

以下是我的接口方法:
/// <summary>
/// IvrSpEngine 的摘要说明
/// </summary>
[WebService(Namespace = "http://www.suntektech.com")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
[SoapDocumentService(RoutingStyle = SoapServiceRoutingStyle.RequestElement)]//防止java调用时出现无法识别 soapAction的问题
// 若要允许使用 ASP.NET AJAX 从脚本中调用此 Web 服务,请取消对下行的注释。
// [System.Web.Script.Services.ScriptService]
public class IvrSpEngine : System.Web.Services.WebService
{
/// <summary>
/// 用户订购关系同步(方向:IVR==>SP)
/// </summary>
/// <returns></returns>
[WebMethod(Description = "用户订购关系同步")]
//[SoapRpcMethod(Use = SoapBindingUse.Literal, Action = "", RequestNamespace = "http://www.suntektech.com", ResponseNamespace = "http://www.suntektech.com")]
public SyncSPUserResult RefreshUserOrder(UserOrderModel userorder)
{

Maticsoft.Model.IVR_UserOrder model = new Maticsoft.Model.IVR_UserOrder();
model.ServiceID = userorder.serviceID;
model.CommandID = userorder.commandID;
model.SequenceNo = userorder.sequenceNo;
model.SubMDN = userorder.subMDN;
model.USERNAME = userorder.USERNAME;
model.PASSWORD = userorder.PASSWORD;
model.STARTTIME = userorder.STARTTIME;
model.VALIDTIME = userorder.VALIDTIME;
model.FACTORY = userorder.FACTORY;
model.PACKAGE = userorder.PACKAGE;
model.PPFlag = userorder.PPFlag;
model.OCS = userorder.OCS;
model.ORDNO = userorder.ORDNO;
model.RESERVED = userorder.RESERVED;

Maticsoft.BLL.IVR_UserOrder bll = new Maticsoft.BLL.IVR_UserOrder();
bll.Add(model);

SyncSPUserResult re = new SyncSPUserResult();
int commandid = int.Parse(userorder.commandID) + 5;
re.commandID = commandid.ToString();
re.sequenceNo = userorder.sequenceNo;
re.result = "0";
re.resultContent = "成功";

/*0 成功
2000 用户容量已满
2001 用户MDN号码已存在
2002 用户MIN号码已存在
2003 系统黑名单用户
2004 重复订购
2005 用户不存在
2006 用户号码非法
2007 时间戳无效
2008 操作员非法
2009 参数错误
2010 数据库操作错误
2011 正在执行升位
2012 写受理日志错误
2013 语言属性错误(远端接口)
2014 业务代码不存在
2015 SP黑名单
2016 SP红名单
2017 CRM中无此用户
2018 CRM中该用户状态不正常
2019 未登记的SP或SPID非法
2020 SP红名单或SP黑名单已存在
2023 余额不足
3003 用户数据库断开
3006 其他错误
*/
return re;
}
}

下面是对方调用后得到的返回数据
.net平台返回消息:<?xml version="1.0" encoding="utf-8"?><soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"><soap:Body><soap:Fault><faultcode>soap:Client</faultcode><faultstring>无法识别请求元素 <refreshUserOrder xmlns='http://www.suntektech.com'>。</faultstring><detail /></soap:Fault></soap:Body></soap:Envelope>
...全文
902 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
weixin_37542007 2018-08-10
  • 打赏
  • 举报
回复
大哥 我现在跟你一样那个接口 我这边为什么接收不到数据
BrightFireOfCy 2015-02-03
  • 打赏
  • 举报
回复
引用 14 楼 qqhahazxxqq 的回复:
我的接口调试通了,最终不是这个问题,是对方给的接口文档把方法名写错了,首写字母r应该是小写的,TMD 接口文档上给我的是大写,好坑人啊,散分庆祝,也谢谢热心的各位
尼玛这也可以!!!!把bug报告写详细点,然后打印出来,贴满他们办公室
qqhahazxxqq 2015-01-30
  • 打赏
  • 举报
回复
我的接口调试通了,最终不是这个问题,是对方给的接口文档把方法名写错了,首写字母r应该是小写的,TMD 接口文档上给我的是大写,好坑人啊,散分庆祝,也谢谢热心的各位
BrightFireOfCy 2015-01-28
  • 打赏
  • 举报
回复
引用 12 楼 qqhahazxxqq 的回复:
[quote=引用 10 楼 sp1234 的回复:] 你提供服务,你还说“没有办法要求对方更改他们的代码”,这可真是怪事情。难道你们是先做好客户端访问服务器的所有程序在那里凭空转着,然后才开始编写服务器端程序? 对方不更改他们的方法,可能是因为你提供的方法没有通用性,不能跨平台。你应该提供基本的 http 服务(使用你得 ashx)就行了,那才能保证跨平台。
我是SP角色,给了一个接口规范给我做数据同步,而且对方给的这个文档的请求消息格式如下
2.1.2.4.1.	请求消息格式:
<?xmlversion="1.0"encoding="UTF-8"?>
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"
	xmlns:xsd="http://www.w3.org/2001/XMLSchema"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
	<soap:Body>
		<RefreshUserOrderRequest>
			<ServiceID>16885885</ServiceID>
			<CommandID>10000</CommandID>
			<SequenceNo>2008111014203900001</SequenceNo>
			<SubMDN>09518552171</SubMDN>
			<USERNAME>张三</USERNAME>
			<PASSWORD>123456</PASSWORD>
			<STARTTIME>2009-09-01 11:20:50</STARTTIME>
			<VALIDTIME></VALIDTIME>
			<FACTORY>4</FACTORY>
			<PACKAGE>0</PACKAGE>
			<PPFlag>0</PPFlag>
			<OCS></OCS>
			<ORDNO></ORDNO>
			<RESERVED></RESERVED>
</RefreshUserOrderRequest>
	</soap:Body>
</soap:Envelope>
和我抓包工具收到的消息格式都不一样,和他们沟通过后说那就按你抓到的消息格式开发。。。。[/quote] 呵呵,这种情况可以或者说应该用非技术手段来搞,跟他们说你们有需求变更,加钱加时间
qqhahazxxqq 2015-01-28
  • 打赏
  • 举报
回复
引用 10 楼 sp1234 的回复:
你提供服务,你还说“没有办法要求对方更改他们的代码”,这可真是怪事情。难道你们是先做好客户端访问服务器的所有程序在那里凭空转着,然后才开始编写服务器端程序? 对方不更改他们的方法,可能是因为你提供的方法没有通用性,不能跨平台。你应该提供基本的 http 服务(使用你得 ashx)就行了,那才能保证跨平台。
我是SP角色,给了一个接口规范给我做数据同步,而且对方给的这个文档的请求消息格式如下
2.1.2.4.1.	请求消息格式:
<?xmlversion="1.0"encoding="UTF-8"?>
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"
	xmlns:xsd="http://www.w3.org/2001/XMLSchema"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
	<soap:Body>
		<RefreshUserOrderRequest>
			<ServiceID>16885885</ServiceID>
			<CommandID>10000</CommandID>
			<SequenceNo>2008111014203900001</SequenceNo>
			<SubMDN>09518552171</SubMDN>
			<USERNAME>张三</USERNAME>
			<PASSWORD>123456</PASSWORD>
			<STARTTIME>2009-09-01 11:20:50</STARTTIME>
			<VALIDTIME></VALIDTIME>
			<FACTORY>4</FACTORY>
			<PACKAGE>0</PACKAGE>
			<PPFlag>0</PPFlag>
			<OCS></OCS>
			<ORDNO></ORDNO>
			<RESERVED></RESERVED>
</RefreshUserOrderRequest>
	</soap:Body>
</soap:Envelope>
和我抓包工具收到的消息格式都不一样,和他们沟通过后说那就按你抓到的消息格式开发。。。。
  • 打赏
  • 举报
回复
基于的 xml 方法不仅仅是“命名空间”坑人这么简单一点事情,还有别的问题。
  • 打赏
  • 举报
回复
你提供服务,你还说“没有办法要求对方更改他们的代码”,这可真是怪事情。难道你们是先做好客户端访问服务器的所有程序在那里凭空转着,然后才开始编写服务器端程序? 对方不更改他们的方法,可能是因为你提供的方法没有通用性,不能跨平台。你应该提供基本的 http 服务(使用你得 ashx)就行了,那才能保证跨平台。
qqhahazxxqq 2015-01-28
  • 打赏
  • 举报
回复
引用 8 楼 BrightFireOfCy 的回复:
不好意思,刚才#7里面,[WebMethod(MessageName="tem:RefreshUserOrder")]这种方法是错误的, 仔细看了下你的request,既然request里面soapaction已经设过了,那就把.net里[SoapDocumentService(RoutingStyle = SoapServiceRoutingStyle.RequestElement)]这句话去掉吧。 webmethod节点有xmlns这个问题暂时无解。 除非你重写httpmodule
谢谢热心回复,去掉[SoapDocumentService(RoutingStyle = SoapServiceRoutingStyle.RequestElement)]后依然不行 我试过
BrightFireOfCy 2015-01-27
  • 打赏
  • 举报
回复
不好意思,刚才#7里面,[WebMethod(MessageName="tem:RefreshUserOrder")]这种方法是错误的, 仔细看了下你的request,既然request里面soapaction已经设过了,那就把.net里[SoapDocumentService(RoutingStyle = SoapServiceRoutingStyle.RequestElement)]这句话去掉吧。 webmethod节点有xmlns这个问题暂时无解。 除非你重写httpmodule
BrightFireOfCy 2015-01-27
  • 打赏
  • 举报
回复
阿,原来java发过来的soapmessage里面定义tem这个namespaces了阿,你.net端预期要一个<refreshUserOrder>节点,但是soapmessage里面只有<tem:refreshUserOrder>节点,试试WebMethodAttribute.MessageName [WebMethod(MessageName="tem:RefreshUserOrder")] public SyncSPUserResult RefreshUserOrder(UserOrderModel userorder)
qqhahazxxqq 2015-01-27
  • 打赏
  • 举报
回复
引用 3 楼 BrightFireOfCy 的回复:
还有一种可能
[WebService(Namespace = "http://www.suntektech.com")]-------这里的namespaces是不是和java端指定的一致

如果java端用aix的话大概代码会是这样的
Service service = new Service();
Call call = (Call) service.createCall();
call.setOperationName(new QName("http://www.suntektech.com", "RefreshUserOrder"));
call.addParameter("XXXXXX", XMLType.XSD_STRING, ParameterMode.IN);
call.setTargetEndpointAddress(new URL("http://localhost:8888/YourService.asmx"));

qqhahazxxqq 2015-01-27
  • 打赏
  • 举报
回复
引用 2 楼 BrightFireOfCy 的回复:
UserOrderModel类实现System.Xml.Serialization了没?
序列化了的
BrightFireOfCy 2015-01-27
  • 打赏
  • 举报
回复
QName的第一个参数要和webservice的namespace保持一致
BrightFireOfCy 2015-01-27
  • 打赏
  • 举报
回复
还有一种可能 [WebService(Namespace = "http://www.suntektech.com")]-------这里的namespaces是不是和java端指定的一致 如果java端用aix的话大概代码会是这样的 Service service = new Service(); Call call = (Call) service.createCall(); call.setOperationName(new QName("http://www.suntektech.com", "RefreshUserOrder")); call.addParameter("XXXXXX", XMLType.XSD_STRING, ParameterMode.IN); call.setTargetEndpointAddress(new URL("http://localhost:8888/YourService.asmx"));
BrightFireOfCy 2015-01-27
  • 打赏
  • 举报
回复
UserOrderModel类实现System.Xml.Serialization了没?
qqhahazxxqq 2015-01-27
  • 打赏
  • 举报
回复
大神都没上班么? 今天
net的最近面试经典试题ASP.NET面试题集合 1. 简述 private、 protected、 public、 internal 修饰符的访问权限。 答 . private : 私有成员, 在类的内部才可以访问。 protected : 保护成员,该类内部和继承类中可以访问。 public : 公共成员,完全公开,没有访问限制。 internal: 在同一命名空间内可以访问。 2 .列举ASP.NET 页面之间传递值的几种方式。 答. 1.使用QueryString, 如....?id=1; response. Redirect().... 2.使用Session变量 3.使用Server.Transfer 3. 一列数的规则如下: 1、1、2、3、5、8、13、21、34...... 求第30位数是多少, 用递归算法实现。 答:public class MainClass { public static void Main() { Console.WriteLine(Foo(30)); } public static int Foo(int i) { if (i 0 && i <= 2) return 1; else return Foo(i -1) + Foo(i - 2); } } 4.C#中的委托是什么?事件是不是一种委托? 答 : 委托可以把一个方法作为参数代入另一个方法。 委托可以理解为指向一个函数的引用。 是,是一种特殊的委托 5.override与重载的区别 答 : override 与重载的区别。重载是方法的名称相同。参数或参数类型不同,进行多次重载以适应不同的需要 Override 是进行基类中函数的重写。为了适应需要。 6.如果在一个B/S结构的系统中需要传递变量值,但是又不能使用Session、Cookie、Application,您有几种方法进行处理? 答 : this.Server.Transfer 7.请编程遍历页面上所有TextBox控件并给它赋值为string.Empty? 答: foreach (System.Windows.Forms.Control control in this.Controls) { if (control is System.Windows.Forms.TextBox) { System.Windows.Forms.TextBox tb = (System.Windows.Forms.TextBox)control ; tb.Text = String.Empty ; } } 8.请编程实现一个冒泡排序算法? 答: int [] array = new int ; int temp = 0 ; for (int i = 0 ; i < array.Length - 1 ; i++) { for (int j = i + 1 ; j < array.Length ; j++) { if (array[j] < array) { temp = array ; array = array[j] ; array[j] = temp ; } } } 9.描述一下C#中索引器的实现过程,是否只能根据数字进行索引? 答:不是。可以用任意类型。 10.求以下表达式的值,写出您想到的一种或几种实现方法: 1-2+3-4+……+m [Page] 答: int Num = this.TextBox1.Text.ToString() ; int Sum = 0 ; for (int i = 0 ; i < Num + 1 ; i++) { if((i%2) == 1) { Sum += i ; } else { Sum = Sum - I ; } } System.Console.WriteLine(Sum.ToString()); System.Console.ReadLine() ; 11.用.net做B/S结构的系统,您是用几层结构来开发,每一层之间的关系以及为什么要这样分层? 答:一般为3层 数据访问层,业务层,表示层。 数据访问层对数据库进行增删查改。 业务层一般分为二层,业务表观层实现与表示层的沟通,业务规则层实现用户密码的安全等。 表示层为了与用户交互例如用户添加表单。 优点: 分工明确,条理清晰,易于调试,而且具有可扩展性。 缺点: 增加成本。 12.在下面的例子里 using Sy

62,046

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧