2015-11-09 2 views
0

Я пытаюсь получить доступ к службе WCF, размещенной в службе Windows с помощью устройства Android. Я прошел через xamarin tutorial для использования службы WCF, размещенной в IIS, и через tutorial для размещения WCF с сервисом Windows и доступа к нему с помощью консольного приложения.
До сих пор я пытался пересечь эти два решения, но ничего не получилось. Все, что я могу сделать, это то, что поймал FileNotFoundException, заявив, что пропустил ServiceReferences.ClientConfig в каталоге /. Поэтому я попытался вставить этот файл (который был создан SLsvcUtil), но ничего не получилось.
Каждый раз, когда я звоню Open, или AddAsync или что-то, я получаю ReferenceNullException.
Итак, как правильно подключиться к сервису WCF с WindowsService с помощью мобильного устройства?Доступ к сервису WCF, размещенному в службе Windows с мобильным устройством

+0

Если вы используете «localHost» и используете эмулятор Android, вы не сможете связаться с ним. Вам нужно будет разместить свою услугу по-настоящему. Просто говорю – user1

+0

Если я говорю мобильное устройство, я говорю о физическом мобильном устройстве. Служба размещается с локальным IP-адресом моего ПК. Эта услуга не предназначена для размещения в Интернете, только внутри локальной сети. И да, устройство находится в той же сети. – EaranMaleasi

+0

Я не уверен, что даже физические устройства могут связаться с LocalHost. Вы должны будете размещать его в своей локальной сети правильно, а не localhost – user1

ответ

0

Хорошо, я получил его на работу:

я снова работал себя через учебник по CodeProject. После этого я создал дополнительный проект Android и добавил класс poxy. Поскольку я не смог использовать файл App.Config, я определил привязку в коде. Методы асинхронные потерпят неудачу по какой-то причине, но упаковка их в Task.Run и ожидая, что просто работает отлично, а также:

void InitializeServiceConnection() 
{ 
    EndpointAddress ea = new EndpointAddress("http://x.x.x.x:9001/CalcService"); 
    BasicHttpBinding bhttpb = new BasicHttpBinding() 
    { 
     Security = new BasicHttpSecurity() 
      { 
       Mode = BasicHttpSecurityMode.None, 
       Transport = new HttpTransportSecurity() 
       { 
        ProxyCredentialType = HttpProxyCredentialType.None, 
        ClientCredentialType = HttpClientCredentialType.None 
       } 
      }, 
     BypassProxyOnLocal = true 
    }; 
    objCalcClient2 = new CalcServiceClient(bhttpb, ea); 
} 

    async void DoStuff() 
    { 
     dblResult = await Task.Run<double>(delegate { return objCalcClient2.Add(dblX, dblY); }); 
     WriteLine(string.Format("Calling Add >> X : {0:F2} Y : {1:F2} Result : {2:F2}", dblX, dblY, dblResult)); 
     dblResult = await Task.Run<double>(() => { return objCalcClient2.Subtract(dblX, dblY); }); 
     WriteLine(string.Format("Calling Sub >> X : {0:F2} Y : {1:F2} Result : {2:F2}", dblX, dblY, dblResult)); 
     dblResult = await Task.Run<double>(() => { return objCalcClient2.Multiply(dblX, dblY); }); 
     WriteLine(string.Format("Calling Mul >> X : {0:F2} Y : {1:F2} Result : {2:F2}", dblX, dblY, dblResult)); 
     dblResult = await Task.Run<double>(() => { return objCalcClient2.Divide(dblX, dblY); }); 
     WriteLine(string.Format("Calling Div >> X : {0:F2} Y : {1:F2} Result : {2:F2}", dblX, dblY, dblResult)); 
    } 

    void WriteLine(string Text) 
    { 
     tvConsole.Text += System.Environment.NewLine + Text; 
     tvConsole.Invalidate(); 
    } 

Я не уверен, если я должен заполнить свойство Transport, чтобы получить необеспеченные и не аутентифицированное соединение, но оно сработало. Это все, что я хочу.

Но самое лучшее, это также работает в проекте Xamarin.Forms как часть библиотеки PCL.

private void Initialize() 
    { 
     EndpointAddress ea = new EndpointAddress("http://x.x.x.x:9001/CalcService"); 
     BasicHttpBinding bhttpb = new BasicHttpBinding(); 
     bhttpb.Security.Mode = BasicHttpSecurityMode.None; 
     objCalcClient2 = new CalcServiceClient(bhttpb, ea); 
    } 

    public async void DoStuff() 
    { 
     dblResult = await Task.Run<double>(delegate { return objCalcClient2.Add(dblX, dblY); }); 
     WriteLine(string.Format("Calling Add >> X : {0:F2} Y : {1:F2} Result : {2:F2}", dblX, dblY, dblResult)); 
     dblResult = await Task.Run<double>(() => { return objCalcClient2.Subtract(dblX, dblY); }); 
     WriteLine(string.Format("Calling Sub >> X : {0:F2} Y : {1:F2} Result : {2:F2}", dblX, dblY, dblResult)); 
     dblResult = await Task.Run<double>(() => { return objCalcClient2.Multiply(dblX, dblY); }); 
     WriteLine(string.Format("Calling Mul >> X : {0:F2} Y : {1:F2} Result : {2:F2}", dblX, dblY, dblResult)); 
     dblResult = await Task.Run<double>(() => { return objCalcClient2.Divide(dblX, dblY); }); 
     WriteLine(string.Format("Calling Div >> X : {0:F2} Y : {1:F2} Result : {2:F2}", dblX, dblY, dblResult)); 
    } 

    void WriteLine(string Text) 
    { 
     Debug.WriteLine(Text); 
    } 

Я думал, что должен был реализовать это для каждого устройства, но нет, WCF тоже можно использовать.

Смежные вопросы