0

次のような JAX-WS Web サービスがあります。

public class NamedDataHandlerContainer {
    public String options; // format is option1_name=option1_value;option2_name=option2_value
    @XmlMimeType("application/octet-stream") public DataHandler dataHandler;
}

@WebService
public interface mtomserver {
    @WebMethod public int saveFile(String name,
    @XmlMimeType("application/octet-stream") List<NamedDataHandlerContainer> contents,
    @XmlMimeType("application/octet-stream") @WebParam(mode = WebParam.Mode.OUT) Holder<List<NamedDataHandlerContainer>> results);
}

その Web サービスの WSDL を .NET 4.0 の SvcUtil で処理すると、NamedDataHandlerContainer.dataHandler の byte[] 型が生成されます。

public partial class namedDataHandlerContainer;
{
    [System.Xml.Serialization.XmlElementAttribute(Form = System.Xml.Schema.XmlSchemaForm.Unqualified, Order = 0)]
    public string options;

    [System.Xml.Serialization.XmlElementAttribute(Form = System.Xml.Schema.XmlSchemaForm.Unqualified, DataType = "base64Binary", Order = 1)]
    public byte[] dataHandler;
}

ただし、App.config では、Mtom アーティファクトが生成されます。

<basicHttpBinding>
    <binding name="mtomserverImplPortBinding" messageEncoding="Mtom" maxReceivedMessageSize="1000000000" />
</basicHttpBinding>

(大量の添付ファイルを許可するために、maxReceivedMessageSize が追加されます)。実際、WCF クライアントは MTOM 添付ファイルをサービスに送信します。HTTP ペイロードをダンプし、次のことを確認します。

--uuid:394d798b-e43e-47cc-82dd-64e32ef51edd+id=1
Content-ID: <http://tempuri.org/0>
Content-Transfer-Encoding: 8bit
Content-Type: application/xop+xml;charset=utf-8;type="text/xml"

<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/"><s:Body xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"><saveFile xmlns="http://wsserver.mtomtest/"><arg0 xmlns="">myfile.bin</arg0><arg1 xmlns=""><options>my options from .NET</options><dataHandler><xop:Include href="cid:http://tempuri.org/1/634993057692269386" xmlns:xop="http://www.w3.org/2004/08/xop/include"/></dataHandler></arg1></saveFile></s:Body></s:Envelope>
--uuid:394d798b-e43e-47cc-82dd-64e32ef51edd+id=1
Content-ID: <http://tempuri.org/1/634993057692269386>
Content-Transfer-Encoding: binary
Content-Type: application/octet-stream

<binary content goes here>

JAX-WS は、そのようなペイロードにストリーミングを正常に適用できます。しかし、.NET 側でストリーミングを実装する方法はありますか? ストリーミングが有効になっているパラメーターは 1 つだけ存在する可能性があると明示的に述べられている MSDN を読みました。ただし、カスタム メッセージ シリアライザー (またはカスタム、私は WCF の専門家ではありません) を使用し、ペイロード全体をメモリに読み込まないようにする方法はありますか。

4

1 に答える 1

0

WCF には、ストリーミングを有効にする構成があります。これを実現するために追加のコードを記述する必要はありません。

<basicHttpBinding>
    <binding name="mtomserverImplPortBinding" messageEncoding="Mtom" maxReceivedMessageSize="1000000000" transferMode="Streamed"/>
</basicHttpBinding>

ソース: http://msdn.microsoft.com/en-us/library/ms789010.aspx

于 2013-06-12T18:01:15.377 に答える