Создание службы WCF для Android - PullRequest
2 голосов
/ 29 мая 2011

У меня есть служба WCF, которая размещена на удаленном сервере с использованием IIS.Я хочу сделать эту службу совместимой с Android, чтобы использовать эту службу на клиенте Android.У меня проблема в том, что я пытаюсь использовать ksoap2 для подключения к сервису, но каждый раз, когда я пытаюсь вызвать метод, он выдает ошибку 400.Я использовал fiddler2, чтобы попытаться выяснить, в чем проблема, и в дополнение к ошибке 400 она также отправляет обратно длину содержимого: 0 (не знаю, является ли это причиной. Интересный факт, когда я указываю содержимоедлина в запросе на fiddler, это не дает мне 400 ошибок, а скорее вообще не возвращает ответ) Я уже пытался изменить привязку к webHttpBinding вместо wsHttpBinding и добавить атрибут WebGet над методомс URITemplate, BodyStyle и т. д., но не повезло.Вот мой код:

Сервис

    public class PublicService : IPublicService
{
    public Wallpaper[] GetWallpapers()
    {
        //return _wallpaperRepository.Items.ToArray();
        return new Wallpaper[]{ new Wallpaper()
                                    {
                                        Id = 10
                                    }};
    }
}

Интерфейс

[ServiceContract(Namespace = "http://XXXXXXXX.com/ServiceA")]
public interface IPublicService
{
    [OperationContract]
    Wallpaper[] GetWallpapers();
}

Web.Config

    <bindings>
            <wsHttpBinding>
<binding name="android" 
maxReceivedMessageSize="4097152" 
maxBufferPoolSize="4097152">
                    <readerQuotas 
maxStringContentLength="4097152" 
maxArrayLength="4097152" 
maxBytesPerRead="4097152" 
maxNameTableCharCount="4097152" 
maxDepth="4097152"/>
                </binding>
            </wsHttpBinding>
        </bindings>
        <services>
            <service name="Service.Concrete.PublicService" behaviorConfiguration="ServiceBehavior">
                <endpoint address="PublicService" binding="wsHttpBinding" name="PublicService" contract="Service.Abstract.IPublicService" bindingConfiguration="android"/>
                <endpoint binding="mexHttpBinding" bindingConfiguration="" name="mex" contract="IMetadataExchange"/>
            </service>

Я бью себя по головеза последние несколько часов и проходя через бесчисленное количество поисков в Интернете, я совершенно не знаю, что делать дальше.Если кто-нибудь знает, что я делаю неправильно, любой совет будет с благодарностью.

1 Ответ

3 голосов
/ 29 мая 2011

Используйте basicHttpBinding вместо.Вы можете попробовать его с конфигурацией по умолчанию:

<endpoint address="PublicService" binding="basicHttpBinding" name="PublicService" contract="Service.Abstract.IPublicService" />

В своей службе Android убедитесь, что вы указываете правильное действие SOAP, правильные пространства имен и что SoapSerializationEnvelope создан для SOAP 1.1 и установлен флаг dotNettrue.

WsHttpBinding по умолчанию для многих расширенных протоколов WS- *.Например, WS-Addressing, которая представляет собой набор хорошо известных заголовков SOAP.Если вы не включите их в свое сообщение, служба WCF отклонит запрос.

WebHttpBinding также не решит проблему, поскольку эта привязка используется для служб REST, но вы хотите использовать службу с помощью ksoap =вам нужен сервис SOAP.

Редактировать:

Еще один вопрос по переполнению стека имеет хороший пример в ответе .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...