この問題を解決するために通常のチャネルを使用してきましたが、Android アプリから C# winforms アプリでホストされている WCF ライブラリにデータを正しく送信する方法を特定できないようです。
Visual Studio が提供する WCFClientTest アプリを使用してサービスが適切にホストされていることを確認しましたが、すべてがその目的で機能しています。この行を呼び出すと: androidHttpTransport.call(SOAP_ACTION, エンベロープ); Android アプリでハングしているように見える
このリンクをチュートリアルとして、WCF サービスを呼び出すために ksoap2 を使用しています。
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";
}