4

SalesForce の SOAP Web サービスと統合しようとしています。私の目標は、SalesForce からユーザー データを単純に取得して、システムに統合できるようにすることです。SalesForce Web サイトのパートナー WSDL から生成したプロキシ クラス (C#) を使用して、正常にログインできます。次にやりたいことは、FirstName、LastName などをプルダウンして、Users にクエリを実行することです...

生成されたプロキシ コードが正しく生成されなかったため、生成されたプロキシ コードを変更せざるを得なかったことを知っておくことは重要です。Web サービス呼び出しを行うときに例外をスローするプライベート フィールドと一致するように、xml シリアライゼーション フィールドを設定しました。また、削除した sObject クラスの「Any」プロパティの空白の名前空間も生成されました。私がこれらの選択をした理由を知りたい場合は、この StackOverflow トピックからアドバイスを受けました。

これは私のクエリがどのように見えるかです: ここに画像の説明を入力

qResult には正確に 3 つのレコードが含まれています (ユーザーが 3 人しかいないため、これは正確です)。問題は、「type」を除く sObject のすべてのプロパティが常に null であることです。

クエリを実行しようとしたときに単純なエラーが発生したのか、それともプロキシ クラスを変更して Any フィールドの名前空間を削除しなければならなかったことがこの問題の原因なのかわかりません。この時点で何をすべきかわかりません。開発者コンソール (SalesForce.com) で同じクエリを実行すると、正しいデータが返されます。また、クエリの結果が適切な量の要素を返したことにも言及する価値があります。それらにはデータが含まれていません。それは単純なものでなければなりません...名前空間バインディングを追加し直すが、それがどうあるべきかを理解するか、プロパティにxmlbindingを追加するなどです。

誰かがこれについて何をすべきか知っているかどうか疑問に思っていました。たぶん誰かが彼らに同じことが起こったことがありますか?

編集: そこで、生成された Web サービス クライアントからの要求をインターセプトするための信じられないほどハックな手法を実行するのに時間をかけ、要求に応じて SalesForce から送信されている生データを取得することになりました。ここにあります:

<?xml version="1.0" encoding="UTF-8"?>
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns="urn:partner.soap.sforce.com" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:sf="urn:sobject.partner.soap.sforce.com">
    <soapenv:Body>
        <queryResponse>
            <result xsi:type="QueryResult">
            <done>true</done>
            <queryLocator xsi:nil="true"/>
            <records xsi:type="sf:sObject">
                <sf:type>User</sf:type>
                <sf:Id xsi:nil="true"/>
                <sf:FirstName>Bob</sf:FirstName>
                <sf:LastName>Dyllan</sf:LastName>
                <sf:Email>bob@bob.com</sf:Email>
                <sf:CompanyName xsi:nil="true"/>
                <sf:Phone xsi:nil="true"/>
                <sf:Title xsi:nil="true"/>
            </records>
            <records xsi:type="sf:sObject">
                <sf:type>User</sf:type>
                <sf:Id xsi:nil="true"/>
                <sf:FirstName>Zachary</sf:FirstName>
                <sf:LastName>Sheppard</sf:LastName>
                <sf:Email>some_guy@yahoo.com</sf:Email>
                <sf:CompanyName>Yahoo</sf:CompanyName>
                <sf:Phone xsi:nil="true"/>  
                <sf:Title xsi:nil="true"/>
            </records>
            <records xsi:type="sf:sObject"> 
                <sf:type>User</sf:type>
                <sf:Id xsi:nil="true"/>
                <sf:FirstName xsi:nil="true"/>
                <sf:LastName>Chatter Expert</sf:LastName>   
                <sf:Email>noreply@chatter.salesforce.com</sf:Email>
                <sf:CompanyName xsi:nil="true"/>        
                <sf:Phone xsi:nil="true"/>
                <sf:Title xsi:nil="true"/>
            </records>
            <size>3</size>
            </result>
        </queryResponse>
    </soapenv:Body>
    </soapenv:Envelope>

これらの sObject の「sf」プロパティのシリアライゼーションの問題のように見えますが、C# と一致させるにはどうすればよいですか? 現在の sObject クラスの C# は次のとおりです。

[System.CodeDom.Compiler.GeneratedCodeAttribute("System.Xml", "4.0.30319.1")]
[System.SerializableAttribute()]
[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
[System.Xml.Serialization.XmlTypeAttribute(Namespace="urn:sobject.partner.soap.sforce.com")]
public partial class sObject
{

    /// <remarks/>
    public string type;

    /// <remarks/>
    [System.Xml.Serialization.XmlElementAttribute("fieldsToNull", IsNullable=true)]
    public string[]
        fieldsToNull;

    /// <remarks/>
    [System.Xml.Serialization.XmlElementAttribute(IsNullable=true)]
    public string
        Id;

    /// <remarks/>
    public System.Xml.XmlElement[]
        Any;
}
4

1 に答える 1

1

信じられないほど長い一日の研究と欲求不満の後で、私はついにSalesForceのsObjectクラスのこの「Any」プロパティの正しい属性に出くわしました。SalesForceは、関連するxml要素をこのsObjectクラスにスクレイプしようとしていました。これにより、sObjectクラスを動的タイプのままにすることができます。したがって、C#クラスにすべてのxmlタグを「Any」プロパティにスクレイプさせるために、これを適用するだけです。

[System.Xml.Serialization.XmlAnyElement]

したがって、明確にするために、SalesForceアカウントからWSDLを生成する場合、そのままでは正しくない可能性があります。APIのクエリ呼び出しから正常な結果を得るには、属性に渡されるいくつかの文字列引数の名前を変更し、sObjectクラスの「Any」プロパティの空の名前空間をXmlAnyElement属性に置き換える必要があります。クライアント機能を作成するために必要な変更は、このStackOverflowトピックトピックにあります。

これで、SalesForce APIのクエリ関数を正常に呼び出して、クエリしたフィールドを取り戻すことができます...とても気分が良くなりました。

于 2012-10-19T15:24:41.613 に答える