簡體   English   中英

從Android KSoap2開始在Mono上運行WCF Soap Service

[英]Consuming WCF Soap Service running on Mono from Android KSoap2

我正在開發一個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<UnknownMessageReceivedEventArgs>(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執行此操作 - 它們都充當代理,通過該代理傳遞本地請求,允許您檢查異常的實際XML請求。 您可以通過這樣做發現明顯的事情,或者至少可以通過更多信息更新您的問題。

接下來,在沒有任何進一步信息的情況下,我只能通過非.NET應用程序與WCF服務交談,提供難忘的體驗:

WCF指定它期望的XML請求,但它實際上要求對象屬性按特定順序排列。 這可以是datacontract中的聲明順序,也可以是隱式字母順序。 無論哪種方式,如果您不按指定的順序提供對象屬性,您將被蜇,事情將無法工作。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM