3

これが私のサービス契約です:

[ServiceContract(Namespace = Service.Namespace)]
[XmlSerializerFormat(Style=OperationFormatStyle.Document, Use=OperationFormatUse.Literal)]
public interface IService
{
    [OperationContract]
    UpdateResponse Update(UpdateRequest request);
}

実装:

[ServiceBehavior(Namespace = Namespace)]
public class Service : IService
{
    public const string Namespace = "http://schemas.localhost.net/test";

    public UpdateResponse Update(UpdateRequest request)
    {
        return new UpdateResponse() { Succeeded = true };
    }
}

メッセージは契約します:

[MessageContract(WrapperNamespace = Service.Namespace)]
public class UpdateRequest
{
    [MessageBodyMember]
    public int Id { get; set; }
    [MessageBodyMember]
    public string Name { get; set; }
}

[MessageContract(WrapperNamespace = Service.Namespace)]
public class UpdateResponse
{
    [MessageBodyMember]
    public bool Succeeded { get; set; }
}

web.configファイル(その一部):

<services>
  <service behaviorConfiguration="returnFaults" name="ServiceTest.Service">
    <endpoint binding="basicHttpBinding" contract="ServiceTest.IService" 
              bindingNamespace="http://schemas.localhost.net/test" />
  </service>
</services>

そして、これがフィドラーから送信された石鹸メッセージ(リクエスト)です:

POST http://localhost:10000/Service.svc HTTP/1.1
SOAPAction: "http://schemas.localhost.net/test/IService/Update"
Content-Type: text/xml; charset="utf-8"
Host: localhost:10000
Content-Length: 532

<?xml version="1.0"?>
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" 
xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/">
<SOAP-ENV:Body xmlns:NS1="http://schemas.localhost.net/test">       
    <NS1:UpdateRequest id="1">  
        <Name xsi:type="xsd:string">Abcdefg</Name><Id xsi:type="xsd:int">1</Id>
    </NS1:UpdateRequest>
    <parameters href="#1"/>
</SOAP-ENV:Body>

Update()操作はUpdateRequestオブジェクトを受け取りますが、フィールドは設定されていません(Nameはnull、Idは0です)。ただし、応答は問題ありません。

4

2 に答える 2

3

Name要素とId要素には名前空間がありません。したがって、石鹸の封筒が正しくないか、MessageContractが完全ではありません。名前/IDは次のようになります。

<NS1:Name xsi:type="xsd:string">Abcdefg</NS1:Name><NS1:Id xsi:type="xsd:int">1</NS1:Id>
于 2012-08-01T07:05:36.050 に答える
1

私はXmlSerializerを使用していました:)しかし、私はメッセージのメンバーを次の属性で装飾しませんでした:

[XmlElement(Form = System.Xml.Schema.XmlSchemaForm.Unqualified), MessageBodyMember]

デシリアライズが機能するようになりました。

PS:Webサービスのクライアントを制御していないため、Tishoが言ったことを実行できませんでした。

于 2012-08-01T09:45:02.560 に答える