从Android KSoap2开始在Mono上运行WCF Soap Service

我正在开发一个Android / C#项目。 我需要做的是有一个WCF soap服务,可以在Windows或Linux(Mono)上运行。

它在Windows上工作正常,我可以从Visual Studio中提供的WCF测试客户端访问Mono上的WCF服务,它工作正常但是当使用KSOAP2访问android时,我收到错误HTTP Request Failed, HTTP status: 415

以下是soap服务的启动方式

 string methodInfo = classDetails + MethodInfo.GetCurrentMethod().Name; try { if (Environment.GetEnvironmentVariable("MONO_STRICT_MS_COMPLIANT") != "yes") { Environment.SetEnvironmentVariable("MONO_STRICT_MS_COMPLIANT", "yes"); } if (String.IsNullOrEmpty(soapServerUrl)) { string message = "Not starting Soap Server: URL or Port number is not set in config file"; library.logging(methodInfo, message); library.setAlarm(message, CommonTasks.AlarmStatus.Medium, methodInfo); return; } Console.WriteLine("Soap Server URL: {0}", soapServerUrl); baseAddress = new Uri(soapServerUrl); host = new ServiceHost(soapHandlerType, baseAddress); BasicHttpBinding basicHttpBinding = new BasicHttpBinding(); //basicHttpBinding.Namespace = "http://tempuri.org/"; var meta = new ServiceMetadataBehavior() { HttpGetEnabled = true, HttpGetUrl = new Uri("", UriKind.Relative), //HttpGetBinding = basicHttpBinding, }; //meta.MetadataExporter.PolicyVersion = PolicyVersion.Policy15; host.Description.Behaviors.Add(meta); host.AddServiceEndpoint(soapManagerInterface, basicHttpBinding, soapServerUrl); host.AddServiceEndpoint(typeof(IMetadataExchange), MetadataExchangeBindings.CreateMexHttpBinding(), "mex"); var debugBehaviour = new ServiceDebugBehavior() { HttpHelpPageEnabled = true, HttpHelpPageUrl = new Uri("", UriKind.Relative), IncludeExceptionDetailInFaults = true, //HttpHelpPageBinding = basicHttpBinding, }; host.Description.Behaviors.Remove(typeof(ServiceDebugBehavior)); host.Description.Behaviors.Add(debugBehaviour); host.Opened += new EventHandler(host_Opened); host.Faulted += new EventHandler(host_Faulted); host.Closed += new EventHandler(host_Closed); host.UnknownMessageReceived += new EventHandler(host_UnknownMessageReceived); host.Open(); } 

soapServerURL是http://192.168.1.74:8000/CritiMon

以下是我尝试使用KSOAP2从android调用soap服务的方法。

 final String soapAction = "http://tempuri.org/ISoapInterface/testSoapFunction"; final String namespace = "http://tempuri.org/"; final String methodName = "testSoapFunction"; final String url = "http://192.168.1.74:8000/CritiMon?wsdl"; String resultData = ""; new Thread(new Runnable() { @Override public void run() { SoapSerializationEnvelope envelope = null; try { //String resultData = ""; SoapObject request = new SoapObject(namespace, methodName); //request.addProperty("firstName", "Chris"); //request.addProperty("lastName", "Board"); envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11); envelope.dotNet = true; envelope.setOutputSoapObject(request); HttpTransportSE http = new HttpTransportSE(url); http.call(soapAction, envelope); SoapPrimitive result = (SoapPrimitive)envelope.getResponse(); String resultData = result.toString(); Log.d("Soap Result", resultData); } catch (Exception ex) { Log.e("Soap Error 2", ex.getMessage()); } 

我不知道我能做些什么才能在Android上使用Mono。

首先,您希望在线路上捕获实际的SOAP请求。 您可以使用Fiddler或SoapUI执行此操作 – 它们都充当代理,通过该代理传递本地请求,允许您检查exception的实际XML请求。 您可以通过这样做发现明显的事情,或者至少可以通过更多信息更新您的问题。

接下来,在没有任何进一步信息的情况下,我只能通过非.NET应用程序与WCF服务进行交流,提供难忘的体验:

WCF指定它期望的XML请求,但它实际上要求对象属性按特定顺序。 这可以是datacontract中的声明顺序,也可以是隐式字母顺序。 无论哪种方式,如果您不按指定的顺序提供对象属性,您将被蜇,事情将无法工作。