这是我第一次使用WCF和Android。所以,抱歉可能很简单的问题:) 这是来自wcf服务库:
[ServiceBehavior]
public class CheckInService : ICheckInService
{
public string Hello()
{
return "Message from WCF!";
}
}
[ServiceContract]
public interface ICheckInService
{
[OperationContract]
[WebInvoke(
Method = "POST",
UriTemplate = "Hello",
BodyStyle = WebMessageBodyStyle.WrappedRequest,
ResponseFormat = WebMessageFormat.Json,
RequestFormat = WebMessageFormat.Json)]
string Hello();
}
这是来自wcf服务网站Service.svc
<%@ ServiceHost Language="C#" Debug="true" Service="TYT.Service.CheckInService" %>
这是来自wcf服务库项目的app.config:
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<system.web>
<compilation debug="true" />
</system.web>
<!-- When deploying the service library project, the content of the config file must be added to the host's
app.config file. System.Configuration does not support config files for libraries. -->
<system.serviceModel>
<services>
<service name="TYT.Service.CheckInService">
<endpoint address="publicService" binding="basicHttpBinding" contract="TYT.Service.ICheckInService">
<identity>
<dns value="localhost" />
</identity>
</endpoint>
<endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
<host>
<baseAddresses>
<add baseAddress="http://localhost:8732/Design_Time_Addresses/TYT.Service/Service1/" />
</baseAddresses>
</host>
</service>
</services>
<behaviors>
<serviceBehaviors>
<behavior>
<!-- To avoid disclosing metadata information,
set the value below to false and remove the metadata endpoint above before deployment -->
<serviceMetadata httpGetEnabled="True"/>
<!-- To receive exception details in faults for debugging purposes,
set the value below to true. Set to false before deployment
to avoid disclosing exception information -->
<serviceDebug includeExceptionDetailInFaults="False" />
</behavior>
</serviceBehaviors>
</behaviors>
</system.serviceModel>
</configuration>
这是来自wcf服务网站的网页配置:
<?xml version="1.0"?>
<configuration>
<system.web>
<compilation debug="false" targetFramework="4.0" />
</system.web>
<system.serviceModel>
<services>
<service name="TYT.Service.CheckInService">
<endpoint address="basic" binding="basicHttpBinding" bindingConfiguration=""
contract="TYT.Service.ICheckInService" />
</service>
</services>
<behaviors>
<serviceBehaviors>
<behavior>
<!-- To avoid disclosing metadata information, set the value below to false and remove the metadata endpoint above before deployment -->
<serviceMetadata httpGetEnabled="true"/>
<!-- To receive exception details in faults for debugging purposes, set the value below to true. Set to false before deployment to avoid disclosing exception information -->
<serviceDebug includeExceptionDetailInFaults="false"/>
</behavior>
</serviceBehaviors>
</behaviors>
<serviceHostingEnvironment multipleSiteBindingsEnabled="true" />
</system.serviceModel>
<system.webServer>
<modules runAllManagedModulesForAllRequests="true"/>
</system.webServer>
</configuration>
ANDROID CODE
private final static String SERVICE_URI = "http://10.0.2.2/tytservice/Service.svc";
try {
// Send GET request to <service>/GetPlates
HttpGet request = new HttpGet(SERVICE_URI + "/Hello");
request.setHeader("Accept", "application/json");
request.setHeader("Content-type", "application/json");
DefaultHttpClient httpClient = new DefaultHttpClient();
HttpResponse response = httpClient.execute(request);
HttpEntity responseEntity = response.getEntity();
// Read response data into buffer
char[] buffer = new char[(int)responseEntity.getContentLength()];
InputStream stream = responseEntity.getContent();
InputStreamReader reader = new InputStreamReader(stream);
reader.read(buffer);
stream.close();
String data = new String(buffer);
但是在数据字符串中,我得到的是整个HTML文档,其中包含以下错误:
<span><H1>Server Error in '/tytservice' Application.<hr width=100% size=1 color=silver></H1>
<h2> <i>The resource cannot be found.</i> </h2></span>
<font face="Arial, Helvetica, Geneva, SunSans-Regular, sans-serif ">
<b> Description: </b>HTTP 404. The resource you are looking for (or one of its dependencies) could have been removed, had its name changed, or is temporarily unavailable. Please review the following URL and make sure that it is spelled correctly.
<br><br>
<b> Requested URL: </b>/tytservice/Service.svc/Hello<br><br>
...
</html>
<!--
[EndpointNotFoundException]: There was no channel actively listening at 'http://vlada-nb/tytservice/Service.svc/Hello'. This is often caused by an incorrect address URI. Ensure that the address to which the message is sent matches an address on which a service is listening.
at System.ServiceModel.Activation.HostedHttpTransportManager.HttpContextReceived(HostedHttpRequestAsyncResult result)
at System.ServiceModel.Activation.HostedHttpRequestAsyncResult.HandleRequest()
at System.ServiceModel.Activation.HostedHttpRequestAsyncResult.BeginRequest()
[HttpException]: There was no channel actively listening at 'http://vlada-nb/tytservice/Service.svc/Hello'. This is often caused by an incorrect address URI. Ensure that the address to which the message is sent matches an address on which a service is listening.
at System.Runtime.AsyncResult.End[TAsyncResult](IAsyncResult result)
at System.ServiceModel.Activation.HostedHttpRequestAsyncResult.End(IAsyncResult result)
at System.Web.HttpApplication.AsyncEventExecutionStep.OnAsyncEventCompletion(IAsyncResult ar)
-->
当我在浏览器中导航到http://localhost/tytservice/Service.svc
时,我会收到服务描述,但如果我添加http://localhost/tytservice/Service.svc/Hello
,我会再次获得404.
它接触到这种方法没有暴露,但我无法想象我错过了什么?
答案 0 :(得分:2)
问题在于:
WebInvoke(
Method = "POST",
您使用HTTP GET调用方法,而不是POST:
HttpGet request = new HttpGet(SERVICE_URI + "/Hello");
request.setHeader("Accept", "application/json");
// ...
您可以将方法更改为Method = "GET"
,或使用HttpPost
进行调用来解决此问题。
另请查看此相关问题: