2009-08-27 17 views
20

WCF akışını İleti Sözleşmeleri ile kullanmaya çalışıyorum çünkü akışın yanında ek parametrelere ihtiyacım var.WCF: İleti Sözleşmeleri ile akışı kullanarak

Temel olarak bir dosya yükleme ve indirme hizmeti oluşturuyorum.

sunucu hatası '/' Uygulamasında: Herşey yolunda olup olmadığını kontrol etmek tarayıcıdan hizmet vurmak çalıştığınızda

yazık ki, aşağıdaki hatayı alıyorum. Sözleşmede 'UploadFile' işlemi 'IFileTransferService', SOAP başlıklarına sahip bir MessageContract kullanır. SOAP başlıkları, None MessageVersion tarafından desteklenmez.

Ne yazık ki bunun için googling yapmak bana önemli bir sonuç vermedi. Bana yardım edebilir misiniz? Burada servisin detayları (indirme bölümünden alan nedeni için çıkardım).

<customBinding> 
    <binding name="customHttpBindingStream"> 
     <textMessageEncoding messageVersion="Soap12" /> 
     <httpTransport transferMode="Streamed" maxReceivedMessageSize="2147483647"/> 
    </binding> 
</customBinding> 

UPDATE:

[ServiceContract(Namespace = "http://www.acme.org/2009/04")] 
public interface IFileTransferService 
{ 
    [OperationContract(Action = "UploadFile")] 
    void UploadFile(FileUploadMessage request); 
} 

[MessageContract] 
public class FileUploadMessage 
{ 
    [MessageHeader(MustUnderstand = true)] 
    public FileMetaData Metadata { get; set; } 

    [MessageBodyMember(Order = 1)] 
    public Stream FileByteStream { get; set; } 
} 

[DataContract(Namespace = "http://schemas.acme.org/2009/04")] 
public class FileMetaData 
{ 
    [DataMember(Name="FileType", Order=0, IsRequired=true)] 
    public FileTypeEnum fileType; 

    [DataMember(Name="localFilename", Order=1, IsRequired=false)] 
    public string localFileName; 

    [DataMember(Name = "remoteFilename", Order = 2, IsRequired = false)] 
    public string remoteFileName; 
} 

Ben basicHttpBinding değil olumlu etkisi ile bağlayıcı bir customhttp hem kullanmaya çalıştık İnternet üzerindeki kaynaklara o MessageContracts ile akış gerçekten mümkün olmalıdır gibi görünüyor. MSDN (Large Data and Streaming) örneğin bakınız: Ben de dosya yükleme hizmetlerini gerçekleştirerek insanlardan blog yayınlarını görmüş ve ben (örneğin here için) bir araya getirmek için çalışıyorum ne çok benzer indirmiş olan

Programming Model for Streamed Transfers

The programming model for streaming is straightforward. For receiving streamed data, specify an operation contract that has a single Stream typed input parameter. For returning streamed data, return a Stream reference. [...] This rule similarly applies to message contracts. As shown in the following message contract, you can have only a single body member in your message contract that is a stream. If you want to communicate additional information with the stream, this information must be a carried in message headers. The message body is exclusively reserved for the stream content.

[MessageContract] 
public class UploadStreamMessage 
{ 
    [MessageHeader] 
    public string appRef; 
    [MessageBodyMember] 
    public Stream data; 
} 

.

GÜNCELLEME 2 Bir basicHttpBinding ile barındırma hizmeti küçük konsol ve kendini yaratma denedim ve orada bir cazibe gibi çalışır. Sorunun IIS üzerinde barındırma olabileceğine inanmaya başlıyorum. Herhangi bir fikir?

UPDATE 3 Kendi yanıtıma bakın.

+0

"MessageBodyMember" özniteliğinde "MessageBodyMember" özniteliğinde gereksiz olduğuna inanıyorum –

cevap

8

Sonunda hata olduğunu öğrendim: o Sabun sürümleri ile ilgisi yoktu, dereler, vb ... Ben sadece kendi hizmetin adını yanlış yazılmış, FileTransfer kullanmak yerine (!) FileTransferService.

Temel olarak, basicHttpBinding gayet iyi, özel bir bağlamaya başvurmam gerekmiyordu.

Orjinal (kötü) sürümü:

<service 
    behaviorConfiguration="serviceBehavior" 
    name="Acme.Service.FileTransfer"> 
    <endpoint address="" 
     name="basicHttpStream" 
     binding="basicHttpBinding" 
     bindingConfiguration="httpLargeMessageStream" 
     contract="Acme.Service.IFileTransferService" /> 
    <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/> 
</service> 

Yeni (sabit) sürümü:

<service 
    behaviorConfiguration="serviceBehavior" 
    name="Acme.Service.FileTransferService"> 
    <endpoint address="" 
     name="basicHttpStream" 
     binding="basicHttpBinding" 
     bindingConfiguration="httpLargeMessageStream" 
     contract="Acme.Service.IFileTransferService" /> 
    <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/> 
</service> 

Hala hata mesajı neler olduğunu anlamak için herhangi bir şekilde yardımcı olduğunu söyleyemeyiz burada ....

Tüm hizmetle ilgileniyorsanız, blogumda aşağıdaki bağlantıdan daha fazla bilgi bulabilirsiniz: File Transfer with WCF

2

Hem istekte hem de yanıtta akışa (yani, tiramlı veri miktarlarının aktarımı) ihtiyacınız var mı? Ya da sadece yanıtta (tipik olarak: bir dosya veya büyük veri kümesi indiriliyor)?

Eğer tepkisi üzerinde sadece gerekiyorsa, transferMode için "StreamedResponse" kurmaları:

<customBinding> 
    <binding name="customHttpBindingStream"> 
     <textMessageEncoding messageVersion="Soap12" /> 
     <httpTransport transferMode="StreamedResponse" 
         maxReceivedMessageSize="2147483647"/> 
    </binding> 
</customBinding> 

"Akış" ayarı her iki yönde akışı olacak - gibi hem istek sunucuya gidiyor sunucudan gelen yanıt olarak, akışa alınacaktır. Çoğu zaman, bu ideal senaryo değildir.

Marc

+0

Merhaba Marc, sorularımda belirttiğim gibi, hem dosya yükleme hem de dosya indirme sağlayan bir dosya hizmeti oluşturuyorum . Bu nedenle, her iki yolu da aktarabilmem gerekiyor. Bunun, yaşadığınız hatayla ilgili bir şey olduğunu düşünüyor musunuz? –

+0

Emin değilim - Daha önce ileti sözleşmeleriyle aktarımın kombinasyonunu hiç görmedim ..... ve sunucudan yalnızca indirme işleminin büyük olduğu (dosyaları indirirken) ve TransferMode'un StreamedResponse olarak ayarlandığı durumları gördüm –

+0

Sadece DataContract (Message Contract bölümü olmadan) kullanırsanız, sadece –

0

'WCF Hizmeti' şablonunun yerine svc dosyasını oluşturmak için 'WCF Veri Hizmeti' şablonunu kullandıktan sonra hatayı aldım. Hizmet ana bilgisayar dosyasını düzeltme sorunu çözüldü.