Да, вы можете сохранить тот же контракт, даже если вы используете конечную точку потока, не имеет значения, содержит ли он поток в качестве типа возврата или параметра.
Чтобы он работал, вам нужно изменитьнекоторые из участников контракта к заголовкам.
[MessageContract]
public class MyContract
{
[MessageHeader]
public string FileName { get; set; }
[MessageBodyMember]
public Stream Content { get; set; }
}