通过Android客户端连接到WCF服务

时间:2011-10-07 11:34:24

标签: java android wcf web-services

我有一个非常简单的Hello World WCF服务,如下所示:

namespace MyWCFServices
{
    public class HelloWorldService : IHelloWorldService
    {

        public String GetMessage()
        {
            return "Hello world";
        }
}
}

namespace MyWCFServices
{
   [ServiceContract(Namespace = "http://127.0.0.1:49359/GetMessage/")]
    public interface IHelloWorldService
    {
        [OperationContract]
        String GetMessage();
    }
}

我的web.config:

<?xml version="1.0"?>
<configuration>
  <system.web>
    <compilation debug="false" targetFramework="4.0" />
  </system.web>
  <system.webServer>
    <modules runAllManagedModulesForAllRequests="true"/>
  </system.webServer>
  <system.serviceModel>
    <behaviors>
      <serviceBehaviors>
        <behavior name="MyServiceTypeBehaviors">
          <serviceMetadata httpGetEnabled="true" />
          <serviceDebug includeExceptionDetailInFaults="false" />
        </behavior>
      </serviceBehaviors>
    </behaviors>
    <services>
      <service name="MyWCFServices.HelloWorldService"
             behaviorConfiguration="MyServiceTypeBehaviors">

        <host>
          <baseAddresses>
            <add baseAddress="http://127.0.0.1:49359/HostDevServer/HelloWorldService.svc" />
          </baseAddresses>
        </host>

        <endpoint name="GetMessage" address="" binding="basicHttpBinding"
             contract="MyWCFServices.IHelloWorldService"/>
        <endpoint contract="IMetadataExchange"
           binding="mexHttpBinding" address="mex"/>
      </service>
    </services>
  </system.serviceModel>
</configuration>

我的android java:

HttpClient httpClient = new DefaultHttpClient(); 

        String url = "http://10.0.2.2:49359/HostDevServer/HelloWorldService.svc/GetMessage";
        //String url = "http://10.0.2.2:49359/HostDevServer/HelloWorldService.svc/GetMessage";
        //String url = "http://localhost:49359/HostDevServer/HelloWorldService.svc";
        //String url = "http://localhost:49359/GetMessage";
        try{

        HttpGet method = new HttpGet( new URI(url) );
        HttpResponse response = httpClient.execute(method);
        if ( response != null )
        {
            Log.i( "login", "received " + getResponse(response.getEntity()) );
        }
        else
        {
            Log.i( "login", "got a null response" );
        }

我收到java.net.SocketException:权限被拒绝。我已经有了:

<uses-permission android:name="android.permission.INTERNET"></uses-permission>

所以或者我的WS不接受连接或者android客户端以错误的方式连接。可能两者都有。对于那些知道,在android客户端需要将10.0.2.2重定向到localhost web服务器,所以没有问题(至少在本地连接到PHP KSOAP WS时有效)

有人可以指导我吗?

3 个答案:

答案 0 :(得分:4)

这是完全错误的。看起来您不了解Web服务的基础知识。您正在公开SOAP服务(basicHttpBinding) - 它期望HTTP POST请求和通信必须遵循SOAP 1.1协议。但是你将它称为HTTP GET =没有SOAP主体。您ServicContract中的命名空间也与实际服务的URL无关。

要调用该服务,您必须构建有效的SOAP请求并发布它。最好在Android上使用一些SOAP协议栈 - 例如kSoap2

Here是使用kSoap2调用WCF服务的示例。

答案 1 :(得分:2)

正如Lanislav所提到的,你可以使用SOAP。但是,始终建议使用需要从设备使用REST服务的服务。这些很容易从任何带有http客户端库的平台上使用。 WCF还提供了一种使用WebHttpBinding和WebGet属性实现REST服务的方法,用于接收GET http消息。

答案 2 :(得分:1)

如果您正在使用SOAP,您应该能够从http://10.0.2.2:49359/HostDevServer/HelloWorldService.svc?WSDL获取WSDL,然后使用wsdl2Java创建要在其中使用的类:)

但休息是最好的! ;)