0

SOAP Web サービスでパフォーマンスの問題が発生しています。Web サービスは Spyne で構築されています。

大きな SOAP オブジェクトをクライアントに送信するため、インターフェイスが必要なデータのみを返すようにインターフェイスを変更することで問題を解決できると思います。

例:

多くのプロパティを持つファブリック ソープ オブジェクトがあります。以下を参照してください。

class Fabric(ComplexModel):
   __namespace__ = 'vadain.webservice.curtainconfig'
   id = Mandatory.Integer
   "Fabric ID"
   articleNumber = String
   "Article Number"
   name = Mandatory.Unicode
   "Fabric Name"
   color = Mandatory.Unicode
   "Color"
   width = Float
   "Fabric Width"
   widthType = WidthType
   "Width Type"
   supplier = Mandatory.Unicode
   supplierId = Integer
   "Supplier"
   ETC.

そして、はるかに!!

ファブリックを検索してファブリックを取得する 2 つのインターフェイスを実装しました。以下を参照してください。

ファブリックを検索:

@rpc(Unicode, _returns=soap.Fabric.customize(max_occurs='unbounded'))
def fabricsWithName(ctx, name):
--Code to get all fabrics with name
return fabrics

生地を入手する:

@rpc(Integer, _returns=soap.Fabric)
def getFabric(ctx, fabric_id):
   --Code to get fabric from ID
return fabric

ファブリックを焼き付けるインターフェイスは、ファブリックのすべてのプロパティを返しますが、これは必須ではありません。ファブリック名と ID のみが返されるように変更できます。

インターフェイス「fabricsWithName」がファブリックの名前と ID のみを返すようにこれを変更するにはどうすればよいですか?これによりパフォーマンスの問題が解決されますか?

4

1 に答える 1

0

必要なものだけを含むクラスに戻り値を設定してみませんか?

例えば

class FabricLite(ComplexModel):
   __namespace__ = 'vadain.webservice.curtainconfig'
   id = Mandatory.Integer

   name = Mandatory.Unicode

# (...)

@rpc(Integer, _returns=FabricLite)
def getFabric(ctx, fabric_id):
    # (...)

関数本体を変更する必要はありません。Spyne は残りのデータを無視します。

また、getFabric 署名を次のように変更します。

@rpc(Mandatory.UnsignedInteger32, _returns=FabricLite)

入力値の検証がより厳密になるようにします。

于 2014-04-30T09:46:19.280 に答える