Android - 将数据发送到Winforms中托管的WCF服务

时间:2013-07-29 17:25:03

标签: c# android wcf

我已经通过正常渠道尝试解决此问题,但我似乎无法确定如何将数据从我的Android应用程序正确发送到我的C#winforms应用程序中托管的WCF库。

我已经检查过使用visual studio提供的WCFClientTest应用程序正确托管服务,一切都在为此而努力。 当我打电话给这一行时: androidHttpTransport.call(SOAP_ACTION,信封); 它似乎挂在Android应用中

我正在使用kso​​ap2尝试调用WCF服务,并以this link作为教程。

Android代码

private static final String METHOD_NAME = "Alive";
    private static final String NAMESPACE = "http://tempuri.org/";
    private static final String SOAP_ACTION 
                               = "http://tempuri.org/IDeviceHealth/Alive";

    //10.0.2.2 is the ip address for the device simulator.
    private static final String URL = "http://192.168.1.8:8733/DeviceHealth/HealthService/mex"; 

    //SOAP must be  the same version as the webservice.
    private static final int SOAP_VERSION = SoapEnvelope.VER12;

public void OnClickGoBtn(View v)
    {
        try 
        {
         SoapObject request = new SoapObject(NAMESPACE, METHOD_NAME);

        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();
        Log.d("WCF Response", resultData);          
        } 
        catch (IOException e) 
        {
          Log.d("WCF IO Error", e.toString());
        }
        catch (XmlPullParserException e) 
        {
            Log.d("XML Pull Error",e.toString());
        }
        catch(Exception e)
        {
            Log.d("General Exception", e.toString());
        }
    }

C#服务器:

 <behaviors>
      <serviceBehaviors>
        <behavior name="MetadataBehavior">
          <serviceMetadata httpGetEnabled="true" />
        </behavior>
      </serviceBehaviors>
    </behaviors>

    <services>
      <service name="DeviceHealthService.DeviceHealth" behaviorConfiguration="MetadataBehavior">

        <endpoint address=""
                  binding="netTcpBinding"
                  contract="DeviceHealthService.IDeviceHealth"/>

        <endpoint address="mex"
                  binding="mexHttpBinding"
                  contract="IMetadataExchange"/>

        <host>
          <baseAddresses>
            <add baseAddress="net.tcp://localhost:10001"/>
            <add baseAddress="http://localhost:10002"/>
          </baseAddresses>
        </host>

      </service>
    </services>

public string Alive()
        {
            return "I am running";
        }

1 个答案:

答案 0 :(得分:0)

你应该在AsyncTask中执行此操作,而不是在主线程上执行此操作!从您的帖子看,您似乎是从主线程中执行此操作。

关于代码的其他所有内容都很正常。我通常会使用超时,但我发现你没有。

另外需要注意的是,您将URL指向“localhost”,但您的Android设备不知道localhost是什么。你应该指向10.0.2.2。

如果有帮助,这是我在我的一个Android应用程序中使用的实用程序方法,它使用基于SOAP的WCF服务。请注意,我总是在AsyncTask中调用它,而不是在主线程上。

public static String invokeSoapWebservice(String method, Bundle properties, int timeout) throws IOException, XmlPullParserException {

    String action = SOAP_ACTION + method;       

    System.out.println("Calling web method " + method);

    SoapObject request = new SoapObject(NAMESPACE, method);

    //Note - ORDER MATTERS HERE
    //If the web method takes employeeId, workSiteId, jobId in that order, 
    //they have to be added to the request in that order (what bullshit!)

    if(properties.containsKey("loginId")) {
        request.addProperty("loginId", properties.getInt("loginId"));
        System.out.println("loginId = " + properties.getInt("loginId"));
    }

    if(properties.containsKey("employeeId")) {
        request.addProperty("employeeId", properties.getInt("employeeId"));
        System.out.println("employeeId = " + properties.getInt("employeeId"));
    }

    if(properties.containsKey("workSiteId")) {
        request.addProperty("workSiteId", properties.getInt("workSiteId"));
        System.out.println("workSiteId = " + properties.getInt("workSiteId"));
    }

    if(properties.containsKey("jobId")) {
        request.addProperty("jobId", properties.getInt("jobId"));
        System.out.println("jobId = " + properties.getInt("jobId"));
    }

    if(properties.containsKey("laborDetailId")) {
        request.addProperty("laborDetailId", properties.getInt("laborDetailId"));
        System.out.println("laborDetailId = " + properties.getInt("laborDetailId"));
    }

    SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SOAP_VERSION);
    envelope.dotNet = true;
    envelope.setOutputSoapObject(request);

    HttpTransportSE androidHttpTransport = new HttpTransportSE(URL, timeout);       

    androidHttpTransport.call(action, envelope);
    Object result = envelope.getResponse();
    String resultData = "null response";
    if(result != null) {
        resultData = result.toString();
    }

    System.out.println("Result for web method " + method + ": " + resultData);

    return resultData;
}