1

WSDL 定義を介して提供される SOAP Web サービスを使用する必要があります。サービス参照を追加すると、操作用の次のコードが生成されます。

[System.ServiceModel.OperationContractAttribute(Action="http://provided.svc/changeBookingRequest", ReplyAction="http://provided.svc/changeBookingResponse")]
[System.ServiceModel.XmlSerializerFormatAttribute(SupportFaults=true)]
[return: System.ServiceModel.MessageParameterAttribute(Name="return")]
Provided.Service.changeBookingResponse changeBooking(Provided.Service.changeBookingRequest request);

問題は、署名を大文字にするように変更したいことです (そして、オブジェクト型objectと応答フィールドを変更します。returnこれらは両方とも C# の予約済みキーワードであり、プロジェクト全体に散らばっているためです) @object:@result

[System.ServiceModel.OperationContractAttribute(Action="http://provided.svc/changeBookingRequest", ReplyAction="http://provided.svc/changeBookingResponse")]
[System.ServiceModel.XmlSerializerFormatAttribute(SupportFaults=true)]
[return: System.ServiceModel.MessageParameterAttribute(Name="return")]
Provided.Service.ChangeBookingResponse ChangeBooking(Provided.Service.ChangeBookingRequest request);

そのために、単純な PowerShell スクリプトを用意しました。

$env:WCF='C:\Program Files (x86)\Microsoft SDKs\Windows\v8.0A\bin\NETFX 4.0 Tools'
$env:CSC='C:\Windows\Microsoft.NET\Framework\v4.0.30319'
$env:Path="$env:WCF;$env:CSC"

svcutil /svcutilconfig:app.config /d:OutFolder `
        /t:code https://*****/**Service?wsdl `
        /serializable /reference:'C:\Users\Andrew\****\**.WsdlImport.dll'

app.config次のセクションがあります。

<?xml version="1.0" encoding="utf-8"?>
<configuration>
    <system.serviceModel>
        ...
        <client>
            ...
            <metadata>
                <wsdlImporters>
                    <extension type="***.WsdlImport.CapitalizeWsdlImporter, ***.WsdlImport, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" />
                </wsdlImporters>
            </metadata>
        </client>
    </system.serviceModel>
</configuration>

CapitalizeWsdlImporterクラスは実装されIWsdlImportExtensionていますが、仮説的に変更できる関連プロパティはすべて読み取り専用です。契約名のみを変更できました:

public void ImportContract(WsdlImporter importer, WsdlContractConversionContext context)
{
    ContractDescription contract = context.Contract;
    contract.Name = "ET" + FirstCharToUpper(contract.Name);
}

私は助けてくれてとても感謝しています!

PSは!私の質問に誰も反応していませんが、私が直面した問題により、これらの醜いクラスとサービス呼び出しを 1 つのプロジェクトに分離することについて深く考えるようになりました。

4

0 に答える 0