无法从安卓使用 WCF 方法

本文关键字:WCF 方法 | 更新日期: 2023-09-27 18:37:21

这是我第一次使用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 网站 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 服务网站的 Web 配置:

<?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>


安卓代码

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. &nbsp;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 &#39;http://vlada-nb/tytservice/Service.svc/Hello&#39;. 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 &#39;http://vlada-nb/tytservice/Service.svc/Hello&#39;. 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。
接缝这种方法没有暴露,但我无法弄清楚我在这里错过了什么?

无法从安卓使用 WCF 方法

问题就在这里:

WebInvoke(
    Method = "POST",

您正在使用HTTP GET而不是POST调用该方法:

HttpGet request = new HttpGet(SERVICE_URI + "/Hello");
request.setHeader("Accept", "application/json");
// ...

可以通过将方法更改为 Method = "GET" 或使用 HttpPost 来调用它来解决此问题。

另请查看此相关问题:

  • WebInvoke Method="POST" 或 "GET" for a REST Service on WCF