Служба отдыха WCF: Исключительная ситуация при доступе из Джерси и TransferMode = Streamed - PullRequest
1 голос
/ 16 января 2012

У меня есть служба WCF-REST с одним методом, который возвращает строку:

[ServiceContract]
public interface IService
{
    [WebInvoke(UriTemplate = "/getastring/")]
    [OperationContract]
    string GetAString(string input);
}

public class Service : IService
{
    public string GetAString(string input)
    {
        Trace.WriteLine("GetAString");
        return input;
    }
}

Служба размещается с WebHttpBinding , а TransferMode имеет значение Потоковое

ServiceHost streamedHost = new ServiceHost(typeof(Service), new Uri("http://localhost/streamed"));
WebHttpBinding streamedBinding = new WebHttpBinding();
streamedBinding.TransferMode = TransferMode.Streamed;
ServiceEndpoint streamedEndpoint = streamedHost.AddServiceEndpoint(typeof(IService), streamedBinding, string.Empty);
streamedEndpoint.Behaviors.Add(new ErrorWebHttpBehavior());
streamedHost.Open();

Когда к сервису обращаются через .NET-клиент, все в порядке. Когда я использую Java-клиент с Джерси, возникает следующее исключение:

Была предпринята попытка выполнить операцию на несуществующем сетевом подключении

Только когда TransferMode установлен на Потоковый .

Используется следующий код Java:

Client client = Client.create(new DefaultClientConfig());
WebResource service = client.resource(UriBuilder.fromUri("http://localhost").build());

String result = service.path("regular/getastring").type(MediaType.APPLICATION_JSON).post(String.class, "123");
System.out.println(result);

Есть ли способ использовать потоковую службу WCF без этого исключения?

Пример проекта: http://dl.dropbox.com/u/21096596/WCF-Jersey.zip

Ответы [ 2 ]

0 голосов
/ 30 апреля 2014

почти через 2 года .. вот мой ответ:

У меня была та же проблема с той же ошибкой, но вы не можете решить, используя StreamedResponse. Как указано в MSDN ЗДЕСЬ , с помощью StreamedResponse включится Streaming для Ответ и Buffered для Запрос .

Так что ... 1015 * будет работать , но в буферизованном режиме . Если вы передаете большие файлы (например, 10 ГБ), ваша программа предварительно загрузит их в ОЗУ перед отправкой.

Теперь, если ваша проблема такая же, как у меня, я могу сказать, что это только на стороне клиента. Я уверен, что ваш Java-код работает для файла размером менее 65,536 байт. Это потому, что вам нужно изменить свойство maxReceivedMessageSize на клиенте для загрузки!

Это тип long, так что вы можете установить максимум 9223372036854775807 байт, но я не думаю, что вам когда-нибудь понадобится так много!

Надеюсь, это поможет тому, кто, как и я, потратил впустую 1 день жизни в этой ситуации!

0 голосов
/ 18 января 2012

Проблема не появляется, если потоковая передача включена только для ответа. Установка TransferMode = TransferMode.StreamedResponse; в конфигурации привязки решает проблему для нас.

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