アップデート
Java WCF クライアントによって生成された SOAP を投稿しました。WCF は正常に動作します。両方のクライアントを生成するために使用された WSDL からのメソッドのメッセージのスキーマも投稿しました。Java クライアントで使用される可能性のある問題の 1 つは、ArrayOfRequestParameter ではなく、外側の配列に ArrayOfArrayOfRequestParameter が必要なように見えることです。
クライアントは、wsimport ユーティリティを実行しているように見える eclispe によって生成されます。Java 側では、パラメーター requests には requests[0] と requests[1] の両方に 2 つの要素があることがわかりますが、サーバーは requests[0] に空の配列を取得し、requests[1] に 2 つの要素を取得します。これは、配列の境界がどのように解釈されるかに関係していると推測しています.WCFデータコントラクトで設定できる属性があるのでしょうか?
メソッドのシグネチャは次のとおりです。
[OperationContract]
Response[] SendMultiPartRequest(string serviceName, RequestParameter[][] requests);
RequestParameter のデータ コントラクトは次のとおりです。
[DataContract]
public class RequestParameter
{
private string _key;
private string _value;
public RequestParameter()
{
}
[DataMember]
public string Key
{
get { return _key; }
set { _key = value; }
}
[DataMember]
public string Value
{
get { return _value; }
set { _value = value; }
}
}
これがWebサービス構成です
<services>
<service behaviorConfiguration="FooServiceBehaviour" name="FooService.WebService">
<endpoint address="" binding="basicHttpBinding" bindingConfiguration="basicConfig" contract="FooService.IFooService"
bindingNamespace="http://foo.com/FooService"
/>
<endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
<host>
<baseAddresses>
<add baseAddress="http://localhost:10000/FooService"/>
</baseAddresses>
</host>
</service>
</services>
<bindings>
<basicHttpBinding>
<binding name="basicConfig" useDefaultWebProxy="true"
maxBufferSize="2147483647" maxReceivedMessageSize="2147483647">
</binding>
</basicHttpBinding>
</bindings>
<!-- For debugging purposes set the includeExceptionDetailInFaults attribute to true -->
<behaviors>
<serviceBehaviors>
<behavior name="FooServiceBehaviour">
<serviceMetadata httpGetEnabled="True"/>
<serviceDebug includeExceptionDetailInFaults="True"/>
<dataContractSerializer maxItemsInObjectGraph="2147483647" />
</behavior>
</serviceBehaviors>
</behaviors>
以下は、Java クライアントによって生成された SOAP 要求です。
<?xml version="1.0" encoding="UTF-8"?>
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<soapenv:Body>
<SendMultiPartRequest xmlns="http://foo.com/FooService">
<serviceName>uploadTrade</serviceName>
<requests>
<ArrayOfRequestParameter>
<ArrayOfRequestParameter>
<Key>a</Key>
<Value>100</Value>
</ArrayOfRequestParameter>
<ArrayOfRequestParameter>
<Key>b</Key>
<Value>200</Value>
</ArrayOfRequestParameter>
</ArrayOfRequestParameter>
<ArrayOfRequestParameter>
<RequestParameter>
<Key>a</Key>
<Value>100</Value>
</RequestParameter>
<RequestParameter>
<Key>b</Key>
<Value>200</Value>
</RequestParameter>
</ArrayOfRequestParameter>
</requests>
</SendMultiPartRequest>
</soapenv:Body>
</soapenv:Envelope>
これは、サーバーで正常に動作する WCF クライアントの SOAP です。
<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
<s:Body>
<SendMultiPartRequest xmlns="http://foo.com/FooService">
<serviceName>service1</serviceName>
<requests xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
<ArrayOfRequestParameter>
<RequestParameter>
<Key>a</Key>
<Value>100</Value>
</RequestParameter>
<RequestParameter>
<Key>b</Key>
<Value>200</Value>
</RequestParameter>
</ArrayOfRequestParameter>
<ArrayOfRequestParameter>
<RequestParameter>
<Key>a</Key>
<Value>100</Value>
</RequestParameter>
<RequestParameter>
<Key>b</Key>
<Value>200</Value>
</RequestParameter>
</ArrayOfRequestParameter>
</requests>
</SendMultiPartRequest>
</s:Body>
</s:Envelope>
関数のメッセージを定義する wsdl の一部を次に示します。
<element name="SendMultiPartRequest">
<complexType>
<sequence>
<element minOccurs="0" name="serviceName" nillable="true" type="xs:string"/>
<element minOccurs="0" name="requests" nillable="true" type="tns:ArrayOfArrayOfRequestParameter"/>
</sequence>
</complexType>
</element>