我有一个非常简单的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时有效)
有人可以指导我吗?
答案 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创建要在其中使用的类:)
但休息是最好的! ;)