我有一个使用eclipse编写的基本java安卓应用程序。我在设备而不是模拟器上测试它(太慢)。 MainActivity目前只访问WCF网址(下面的代码)。 WCF服务是一个简单的GET方法,它托管在IIS上。我可以使用下面给出的url从firefox访问服务方法。我暂时关闭了防火墙。在命令netstat -an上我可以看到:
TCP 0.0.0.0:8080 0.0.0.0:0 LISTENING
我的问题是虽然可以从浏览器访问该服务,但我无法从该应用程序进行连接。它保持超时。
我已尝试过localhost,10.0.2.2以及我的lan ip。
我的代码是:
MainActivity
URL url = new URL("http://10.0.2.2:8080/tst/Service1.svc/getMsg/kkk");
urlConnection = (HttpURLConnection) url.openConnection();
urlConnection.setDoOutput(true);
urlConnection.setRequestMethod("GET");
urlConnection.setUseCaches(false);
urlConnection.setConnectTimeout(10000);
urlConnection.setReadTimeout(10000);
urlConnection.setRequestProperty("Content-Type","application/json");
urlConnection.setRequestProperty("Host", "10.0.2.2:8080");
urlConnection.connect();
int HttpResult =urlConnection.getResponseCode();
if(HttpResult ==HttpURLConnection.HTTP_OK)
{
....
的AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.secondprj"
android:versionCode="1"
android:versionName="1.0" >
<uses-permission android:name="android.permission.INTERNET"/>
<uses-sdk
android:minSdkVersion="11"
android:targetSdkVersion="23" />
<application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<activity
android:name=".MainActivity"
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
服务代码
public class Service1 : IService1
{
public string GetMessage(String name)
{
return "abc " + name;
}
...
我已将其部署在IIS中的文件夹'tst'下。
Web.config是:
<?xml version="1.0"?>
<configuration>
<appSettings>
<add key="aspnet:UseTaskFriendlySynchronizationContext" value="true" />
</appSettings>
<system.web>
<compilation debug="true" targetFramework="4.5" />
<httpRuntime targetFramework="4.5"/>
</system.web>
<system.serviceModel>
<services>
<service
name="WcfService1.Service1"
>
<host>
<baseAddresses>
<add baseAddress="http://localhost:8080/"/>
</baseAddresses>
</host>
<endpoint address=""
binding="webHttpBinding"
contract="WcfService1.IService1"
behaviorConfiguration="web"/>
</service>
</services>
<behaviors>
<serviceBehaviors>
<behavior name="MyServiceBehavior">
<serviceMetadata httpGetEnabled="false"/>
<serviceDebug includeExceptionDetailInFaults="true"/>
</behavior>
<behavior>
<serviceMetadata httpGetEnabled="true" httpsGetEnabled="true"/>
<serviceDebug includeExceptionDetailInFaults="false"/>
</behavior>
</serviceBehaviors>
<endpointBehaviors>
<behavior name="web" >
<webHttp/>
</behavior>
</endpointBehaviors>
</behaviors>
<protocolMapping>
<add binding="basicHttpsBinding" scheme="https" />
</protocolMapping>
<serviceHostingEnvironment aspNetCompatibilityEnabled="true" multipleSiteBindingsEnabled="true" />
</system.serviceModel>
<system.webServer>
<modules runAllManagedModulesForAllRequests="true"/>
<directoryBrowse enabled="true"/>
</system.webServer>
</configuration>
接口
namespace WcfService1
{
[ServiceContract]
public interface IService1
{
[OperationContract]
//[WebInvoke(Method = "POST", RequestFormat = WebMessageFormat.Json,
// ResponseFormat = WebMessageFormat.Json,
//UriTemplate = "getMsg")]
[WebInvoke(Method = "GET",
ResponseFormat = WebMessageFormat.Json,
UriTemplate = "getMsg/{name}")]
string GetMessage(string name);
}
}
请查看代码,如果我犯了一些错误,请告诉我。后来我想使用POST而不是GET
EDIT ::: 我已经使用浏览器的调用调试了wcf。在调试中似乎没有问题。我希望在IIs上安装wcf时进行调试。我该怎么办?此外,对WCF的调用来自Android应用程序。来电时fiddler没有显示任何新项目。如果任何人使用此工具拦截来自Android应用程序的请求,请帮助...
EDIT2 :: 尝试更改wcf服务的端口。现在获得405响应。请提出你的建议!