我有一个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-Client访问服务时,一切都很好。 当我使用带泽西的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服务?
答案 0 :(得分:0)
如果仅为响应启用了流式传输,则不会出现此问题。
在绑定配置中设置TransferMode = TransferMode.StreamedResponse;
可以解决我们的问题。
答案 1 :(得分:0)
我遇到了同样的错误同样的问题,但你无法使用StreamedResponse
来解决。如MSDN HERE中所述,使用StreamedResponse
将为{strong>响应启用Streaming
,为请求启用Buffered
。
所以.. 将工作,但是在缓冲模式下。如果要传输大文件(如10gb),程序会在发送前将其预先加载到RAM中。
现在,如果您的问题与我的问题相同,我可以告诉它唯一的客户端。我很确定你的java代码适用于小于65.536字节的文件。那是因为您需要在客户端上更改maxReceivedMessageSize
属性以进行下载!
它是long
类型,因此您可以设置为 9223372036854775807 字节的最大值,但我认为您不会需要那么多!
希望这有助于像我一样在这种情况下浪费一天的人!