2013-07-23 2 views
3

Я работаю над проектом android/C#. То, что мне нужно, это иметь WCP-мыльную услугу, которая может работать как в Windows, так и в Linux (Mono).Потребление WCF Soap Service работает на Mono с Android KSoap2

Сво работает отлично на Windows, и я могу получить доступ к службе WCF на Mono от клиента WCF тестирования, представленного в Visual Studio, и она работает нормально, но при доступе к Android с помощью KSOAP2 я получаю ошибку HTTP Request Failed, HTTP status: 415

Ниже приводится как мыло начато

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<UnknownMessageReceivedEventArgs>(host_UnknownMessageReceived); 
       host.Open(); 
      } 

SoapServerURL is http://192.168.1.74:8000/CritiMon.

Ниже приведен пример того, как я пытаюсь вызвать службу мыла от android, используя KSOAP2.

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()); 
} 

Я понятия не имею, что я могу сделать, чтобы эта работа работала над Mono с Android. Любая помощь будет оценена по достоинству.

ответ

1

Во-первых, вы хотите поймать фактический запрос SOAP на проводе. Вы можете сделать это с помощью Fiddler или SoapUI - они оба действуют как прокси-серверы, через которые передаются локальные запросы, что позволяет вам проверять фактический запрос XML для аномалий. Вы можете обнаружить что-то очевидное, выполнив это, или вы можете, по крайней мере, обновить свой вопрос с дополнительной информацией.

После этого, и без какой-либо дополнительной информации, я могу только предложить незабываемый опыт с разговором с услугами WCF из non-.NET приложений:

WCF определяющего запрос XML, что он ожидает, но на самом деле требует объекта свойства должны быть в определенном порядке. Это может быть объявленный порядок в datacontract, или он может быть неявным алфавитным порядком. В любом случае, если вы не предоставите свойства объекта в указанном порядке, вы будете ужалены, и все не сработает.

+0

Благодаря SoapUI определенно помог отладить проблему. Я узнал, что Android немного отклонил неправильный тип контента, поэтому мне удалось выяснить, как переопределить тип контента, на что ожидала услуга мыла, и теперь она работает. Спасибо за помощь – Boardy