如何在Android应用调用WCF服务时去除http://tempuri.org/
关于WCF服务tempuri.org相关问题的解决方法
为什么代码里需要用到tempuri.org
tempuri.org是微软WCF框架的默认SOAP命名空间,所有未手动修改配置的WCF服务都会默认使用该地址作为服务契约的唯一标识。
你代码里写的该地址不会作为实际网络请求的目标地址,它仅用来在SOAP协议报文里标识服务归属,避免不同服务存在同名方法时出现调用冲突,实际所有请求都会发送到你代码里填写的https://MyOwnUrl.com:444/Service1.svc地址。
谷歌下架你的应用是因为其APK扫描机制直接检测到了代码中的tempuri.org明文字符串,误以为你在将用户数据上传到该陌生域名,所以触发了下架规则。
移除tempuri.org的操作步骤
你只需要前后端统一修改命名空间为你自己的域名即可,功能不会受到任何影响:
第一步:修改WCF服务端配置
给你的WCF服务相关类添加自定义命名空间属性,修改完成后重新部署服务即可:
// 服务契约接口添加Namespace属性 [ServiceContract(Namespace = "https://你自己的域名.com/")] public interface IService1 { // 你的原有接口方法 [OperationContract] string HelloWorld(string OneParameter); } // 服务实现类添加Namespace属性 [ServiceBehavior(Namespace = "https://你自己的域名.com/")] public class Service1 : IService1 { // 你的原有实现代码 } // 如果有数据契约类,也同步修改Namespace [DataContract(Namespace = "https://你自己的域名.com/")] public class 你的数据类 { // 原有属性定义 }
第二步:修改Android端代码
将你原有代码里的命名空间和SOAP_ACTION的前缀替换成和服务端一致的自定义域名即可:
String METHOD_NAME = "HelloWorld"; // 替换成你服务端设置的自定义命名空间 String NAMESPACE = "https://你自己的域名.com/"; String SOAP_ACTION = NAMESPACE + "IService1/" + METHOD_NAME; int SOAP_VERSION = SoapEnvelope.VER11; String URL = "https://MyOwnUrl.com:444/Service1.svc"; try { SoapObject request = new SoapObject(NAMESPACE, METHOD_NAME); request.addProperty("OneParameter", "This is a text parameter"); SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SOAP_VERSION); envelope.dotNet = true; envelope.setOutputSoapObject(request); HttpTransportSE androidHttpTransport = new HttpTransportSE(URL); androidHttpTransport.call(SOAP_ACTION, envelope); Object result = envelope.getResponse(); String resultData = result.toString(); return resultData; } catch (IOException e) { } catch (XmlPullParserException e) { }
修改完成后重新打包应用上传到Google Play即可,代码里已经没有tempuri.org的相关字符串,不会再触发谷歌的下架检测规则。
内容的提问来源于stack exchange,提问作者Ton
相关产品推荐
相关产品推荐

