1

SUM: XML を手動で作成する必要がありました。また、Operation を作成し、その send(); を使用する必要がありました。WebService.MyServiceFunction(); のようなことをするだけではなく、メソッド -なぜそうなったのかわかりません。

次のようにリクエストを送信します。

            var xm:XML =
                <SetPropertiesForCurrentUser xmlns="http://asp.net/ApplicationServices/v200">
                    <values xmlns:d4p1="http://schemas.microsoft.com/2003/10/Serialization/Arrays" xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
                        <d4p1:KeyValueOfstringanyType>
                            <d4p1:Key>{obj.Key}</d4p1:Key>
                            <d4p1:Value xmlns:d6p1="http://www.w3.org/2001/XMLSchema" i:type="d6p1:string">{obj.Value}</d4p1:Value>
                        </d4p1:KeyValueOfstringanyType>
                    </values>
                </SetPropertiesForCurrentUser>;

            var profileService:WebService = new WebService();
            profileService.useProxy = false;
            profileService.loadWSDL(url);

            var o:Operation = profileService.SetPropertiesForCurrentUser;
            o.send(xm);

これが私のシナリオです:

認証、ユーザー ロール、およびユーザー プロファイルを処理するための ASP.NET Web サービスがあります (正確には、既定の ASP.NET AuthenticationService、RoleService、および ProfileService)。

したがって、私の Flex Web アプリから、ASP.NET サービスを正常に呼び出すことができます。たとえば、次のようなものは正常に機能します。

var profileService:WebService = new WebService();
profileService.useProxy = false;
profileService.GetAllPropertiesForCurrentUser.addEventListener("result",getAllPropertiesForCurrentUser_EventHandler);
profileService.addEventListener("fault",getAllPropertiesForCurrentUserFault_EventHandler);
profileService.loadWSDL(url);
profileService.GetAllPropertiesForCurrentUser();

Dictionary オブジェクトをサービスの別の関数 (SetPropertiesForCurrentUser) に渡す必要があるときに問題が発生します。.NET サービスは、次のタイプの値を要求します。

System.Collections.Generic.IDictionary(文字列、オブジェクト)

ASP.NET サービスの web.config エントリからの 2 つの関連エントリを次に示します。

    <properties>
        <clear/>
        <add name="coordinateFormat" />
    </properties>
...
    <profileService enabled="true"
      readAccessProperties="coordinateFormat"
      writeAccessProperties="coordinateFormat"/>

そのため、Silverlight アプリからの SOAP 要求 (期待どおりに動作) をまとめた後、SOAP ハンドラーに送信される XML 要求の違いに絞り込みました。

フレックスから:

<tns:Value>DMS</tns:Value>

シルバーライト より:

<d4p1:Value xmlns:d6p1="http://www.w3.org/2001/XMLSchema" i:type="d6p1:string">DMS</d4p1:Value>

Flex によって生成された要求を受け取り、Fiddler でキャッチし、その 1 行を変更して「type」名前空間を含めると、機能します。

Actionscript から SOAP ハンドラーに渡される変数にその名前空間を取得する方法を知っている人はいますか? その SetPropertiesForCurrentUser 関数を送信するための私のコードは次のとおりです。

var obj:Object = {};
obj["Key"] = "coordinateFormat";
obj["Value"] = DMS;

var profileService:WebService = new WebService();
profileService.useProxy = false;
profileService.SetPropertiesForCurrentUser.addEventListener("result",setPropertiesForCurrentUser_EventHandler);
profileService.addEventListener("fault",setPropertiesForCurrentUserFault_EventHandler);
profileService.loadWSDL(url);
profileService.SetPropertiesForCurrentUser(new ArrayCollection([obj]),false);

ありがとう、ジョシュ

4

1 に答える 1

0

使用されるデフォルトの SOAPEncoder は、その機能が制限されているものです (上記の type 属性を含めないなど)。幸いなことに、独自のエンコーダーを作成することでそれを制御する方法があります。

Adobe でこのリンクを参照してください (カスタム Web サービスのシリアル化の使用に関する部分を読んでください) Adob​​eのサイトのリンク

于 2012-11-27T17:05:55.680 に答える