Silverlight是不喜欢我的WCF MessageContract。 为什么?(Silve

2019-07-05 18:03发布

我试图通过使用下面的一个Silverlight客户端上传文件MessageContract

[MessageContract]
public class CategoryClientFileTransferMC : IDisposable
{
    /// <summary>
    /// CategoryID - Category identity.
    /// </summary>
    [MessageHeader(MustUnderstand = true)]
    public int CategoryID;

    /// <summary>
    /// ID - File identifier.
    /// </summary>
    [MessageHeader(MustUnderstand = true)]
    public string ID;

    /// <summary>
    /// Length - File length in bytes.
    /// </summary>
    [MessageHeader(MustUnderstand = true)]
    public long Length;

    /// <summary>
    /// FileByteStream - File stream.
    /// </summary>
    [MessageBodyMember(Order = 1)]
    public Stream FileByteStream;

    /// <summary>
    /// Dispose the contract.
    /// </summary>
    public void Dispose()
    {
        if (FileByteStream != null)
        {
            FileByteStream.Close();
            FileByteStream = null;
        }
    }
}

我的问题是,在客户端上所生成的操作方法仅需要一个单一的参数; 称为一个字节数组FileByteStream 。 在其他(非Silverlight的)客户端我创建它要求MemberHeader领域也是如此。 如果没有指定这些标题,服务器不知道如何处理该文件。 如何设置这些标题,当我打电话的操作?

此外,有没有更好的方法来从Silverlight客户端上传文件? 这是一个巨大的头痛。

谢谢。

Answer 1:

WCF客户端的Silverlight的子集,不支持[MessageHeader]属性。 您仍然可以设置邮件标题,但它并不像其他平台一样简单。 基本上,你需要使用操作语境头设置,使得通话,就像下面的例子之前:

var client = new SilverlightReference1.MyClient();
using (new OperationContextScope(client.InnerChannel))
{
    string contractNamespace = "http://tempuri.org/";
    OperationContext.Current.OutgoingMessageHeaders.Add(
        MessageHeader.CreateHeader("CategoryId", contractNamespace, 1));
    OperationContext.Current.OutgoingMessageHeaders.Add(
        MessageHeader.CreateHeader("ID", contractNamespace, "abc123"));
    OperationContext.Current.OutgoingMessageHeaders.Add(
        MessageHeader.CreateHeader("Length", contractNamespace, 123456L));
    client.UploadFile(myFileContents);
}

其中contractNamespace是消息头字段的XML命名空间(IIRC它们默认一样的服务合同)。 您可以使用Fiddler和类似WCF测试客户端,看看哪个命名空间用于那里。



文章来源: Silverlight is not liking my WCF MessageContract. Why?