2016-08-02 5 views
0

Ich bin so neu über Android und WCF-Service. Ich habe eine Erwartung.WCF Service Android Verbindung

Dies ist android Funktion:

[ServiceContract()] 
public interface IService1 
{ 

    [OperationContract] 
    [WebInvoke(Method= "POST", UriTemplate = "GetData?parameter={parameter}", ResponseFormat = WebMessageFormat.Json)] 
    string GetData(string parameter); 

    [OperationContract] 
    CompositeType GetDataUsingDataContract(CompositeType composite); 

    // TODO: Add your service operations here 
} 


    public string GetData(String value) 
    { 
     return string.Format("You entered: {0}", value); 
    } 

und das ist config-Datei:

<?xml version="1.0"?> 
<configuration> 

    <appSettings> 
    <add key="aspnet:UseTaskFriendlySynchronizationContext" value="true" /> 
    </appSettings> 
    <system.web> 
    <compilation debug="true" targetFramework="4.5.2" /> 
    <httpRuntime targetFramework="4.5.2"/> 
    </system.web> 
    <system.serviceModel> 
    <behaviors> 
     <serviceBehaviors> 
     <behavior name="http_behavior"> 
      <serviceMetadata httpGetEnabled="true" /> 
      <serviceDebug includeExceptionDetailInFaults="true" /> 
     </behavior> 
     </serviceBehaviors> 
    </behaviors> 

    <services> 
     <service behaviorConfiguration="http_behavior" name="WcfServiceGps.Service1"> 

     <endpoint address="" binding="webHttpBinding" bindingConfiguration="" 
      name="GetData" contract="WcfServiceGps.IService1" /> 
     <endpoint address="mex" binding="mexHttpBinding" name="GetDataMex" 
      contract="IMetadataExchange" /> 
     <host> 
      <baseAddresses> 
      <add baseAddress="http://192.168.30.117:59151/Service1.svc/" /> 
      </baseAddresses> 
     </host> 
     </service> 
    </services> 
    </system.serviceModel> 
    <system.webServer> 
    <modules runAllManagedModulesForAllRequests="true"/> 
    <directoryBrowse enabled="true"/> 
    </system.webServer> 

wenn ich rufen werde die

private void Post(String VAL) 
{ 
    HttpClient httpClient = new DefaultHttpClient(); 
    try 
    { 
     String aaa = "aaa"; 
     String url = "http://192.168.30.117:59151/IService1"; 
     HttpPost method = new HttpPost(url); 
     StringEntity e = new StringEntity("{ \"something\":12345 }", "UTF-8"); 
     method.setEntity(e); 
     method.setHeader("content-type", "application/json"); 
     method.setHeader("Accept", "application/json"); 
     HttpResponse response = httpClient.execute(method); 
     HttpEntity entity = response.getEntity(); 
     if(entity != null) 
     { 
      System.out.println(entity); 
     } 
    } catch (IOException e) { 
     Log.e("error", e.getMessage()); 
    }} 
hier

wcf Teil ist Service von Android

HttpResponse response = httpClient.execute(method); 

es gibt die folgende Ausnahme:

+0

Können Sie bitte die Ausnahme ausfüllen, die Sie erhalten, bitte unter der letzten Zeile? Vielen Dank. – Animesh

+0

FATAL AUSNAHME: Haupt Prozess: com.example.celal.gpssystem, PID: 4298 android.os.NetworkOnMainThreadException bei android.os.StrictMode $ AndroidBlockGuardPolicy.onNetwork –

Antwort

0

Wenn Sie eine virtuelle Maschine verwenden, um Ihre App auf Android zu kompilieren, Sie Sichtbarkeit auf dem Server verfügen müssen, das gleiche, wenn Sie eine virtuelle Maschine verwenden. Sie erhalten diese Ausnahme, weil sich Ihre Geräte nicht im selben Netzwerk befinden und es scheint, dass Sie Ihren Server nicht bereitstellen, Sie kompilieren ihn nur in Visual Studio ... Was ist das? '59151' die Portnummer von IIS Express ?.

Donwload IIS auf Windows und stellen Sie Ihren Server, dann verwenden Sie ipconfig Befehl, um Ihre IP-Adresse in Ihrem lokalen Netzwerk oft versuchen, mit Ihrem Server mit dem Android-Browser (Schreiben Sie Ihre IP 192.168.X.X) zu verbinden. Wenn es funktioniert, versuchen Sie, einen REST-Service in Ihrem Android-Browser aufzurufen, und wenn es auch funktioniert, können Sie jetzt Ihren REST-Anruf in Android testen.

Nebenbei verwenden Sie Retrofit 2 als REST-Bibliothek.

+0

ich meinen Fehler verstanden, werde ich Ihre Antwort danke versuchen. –

0

Wenn Sie in Ihrem Haupt-Thread API aufrufen, tun Sie es nicht. Verwenden Sie AsyncTask, um API zu verbrauchen. Und setzen Sie diese Zeile in Ihre Aktivität oder Fragment, was Sie verwenden.

if (android.os.Build.VERSION.SDK_INT > 9) { 
    StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build(); 
    StrictMode.setThreadPolicy(policy); 
}