1

序文

お客様にサービスAPIを提供しています。

各顧客には独自のサブドメイン(例:sergii.ourwebsite.com)と独自のWSDL URLがあり、http ://sergii.ourwebsite.com/api/bsapi.cfc?wsdlのようになります。

また、すべてのWebサイト(もちろんAPIを含む)は同じコードベースを使用しています。


問題

たとえば、同じCFサーバー上の2つのアプリケーション。一部のお客様のWebサイトは当社のサーバーでホストされているため、これは簡単に発生する可能性があります。

どちらも独自のAPIWSDLを使用しようとしています。たとえば、次のようになります。

http://sergii.ourwebsite.com/api/bsapi.cfc?wsdl
http://galashyn.ourwebsite.com/api/bsapi.cfc?wsdl

そして、ここに問題があります。

2番目のWebサイトがWebサービスを登録しようとすると、CFはエラーをスローします。

名前: https ://galashyn.ourwebsite.com/api/bsapi.cfc?wsdl 。WSDL: https ://galashyn.ourwebsite.com/api/bsapi.cfc?wsdl 。org.apache.axis.wsdl.toJava.DuplicateFileException:重複するファイル名:/opt/coldfusion8/stubs/WS1985941973/api/Bsapi.java。ヒント:同じ名前の要素を持つ2つの名前空間を同じパッケージ名にマップした可能性があります。Webブラウザーを使用して、要求されたWSDLドキュメントを取得および調査し、それが正しいことを確認することをお勧めします。要求されたWSDLドキュメントを取得できないか、動的に生成される場合は、ターゲットWebサービスにプログラミングエラーがある可能性があります。

問題は、両方がCFCパスから構築された同じWSDL名前空間を使用していることです。

<wsdl:definitions targetNamespace="http://api">


現在のソリューション

私たちにとって有効な唯一の解決策は、次のようなCFCエイリアスを使用することです。

http://galashyn.ourwebsite.com/api/v1n1/bsapi.cfc?wsdl
http://galashyn.ourwebsite.com/api/v1n1/bsapi.cfc?wsdl

この各CFCは、次のように親を拡張します。

<cfcomponent output="false" extends="api.bsapi">
<!--- this component used to extend base api version 1.x --->
</cfcomponent>

それらは異なる名前空間を生成し、問題なく使用できます-アプリケーションごとに独自の名前空間:

<wsdl:definitions targetNamespace="http://v1n1.api">
<wsdl:definitions targetNamespace="http://v1n2.api">


これはかなりばかげた回避策ですが、今のところは機能します。


他の解決策は、単一のAPIサブドメインを使用し、何らかのキーで顧客を識別することです(セキュリティ目的ですでに使用しています)が、レガシーコードが原因で、深刻な悪影響があります。


私はJavaを知らないので、具体的なアドバイスの多くは私にはそれほど明確ではないことに注意してください。

グーグルはこの問題が何年も存在することを示しています、しかし私は賢い解決策を見つけることができません。

だから多分ここ?

4

4 に答える 4

2

今のところ、「すべての顧客に共通の URL に WSDL を配置する」ことはできません。その理由を説明しました。サブドメインを使用する必要があるからです。ある URL に WSDL を置き、別の URL にサービス要求を行う方法を知っている場合は、教えてください。

WSDL は、Web サービスを記述する単なる XML ドキュメントです。CFML を使用して記述 (カスタマイズ) できます。例えば:

http://subdomain.domain.com/api/wsdl.cfm?api=bsapi&customer=subdomain

次に、CF によって生成された WSDL をコピーし、それをカスタム WSDL ページのテンプレートとして使用します。サブドメイン固有の WSDL の部分を置き換えて、XML ドキュメントを返します。空白に注意し (おそらくCFSilentCFSettingを参照)、 CFHeaderを使用して MIME タイプを「text/xml」に設定することを検討してください。

于 2009-07-14T15:23:39.653 に答える
1

すべての顧客が同じ WSDL を使用していますか? 次に、すべての顧客に共通の URL に WSDL を配置します。

また、エラー メッセージの意味を正確に把握する必要があると思います。使用されている URL とどこが関係しているのかわかりません。別の顧客の URL が記載されていれば、理解できたはずです。


これの一部は、CF の仕組みを理解していないことが原因である可能性があります。特に、2人の顧客が行うと問題が発生するこの「Webサービスの登録」とは何ですか?

<soap:address/>WSDL の要素の URL はヒントにすぎないことに気付きましたか? 多くのクライアントでは、オーバーライドできます。.NET クライアントでは、プロキシ クラスの Url プロパティを設定するだけです。これにより、1 つの場所に 1 つの WSDL を配置しながら、その情報を顧客に伝える何らかの方法があると仮定して、顧客がそれぞれ適切なサブドメインを参照できるようになります。たとえば、どの顧客が電話をかけているかを知る方法がある場合、1 つの URL で電話を受けてから適切な URL にリダイレクトするか、SOAP ルーティング インフラストラクチャを使用して正しい URL にルーティングすることができます。

名前空間を顧客ごとに変更しないことを願っています。名前空間は、たまたま URL のように見えたとしても、URL とは何の関係もありません。

于 2009-07-13T14:24:39.370 に答える
0

cfcomponent タグの名前空間属性があります。これを cgi.host_name (? I'm at home, without docs) と共に使用して、クエリ対象のサブドメインに一致する名前空間を指定できるはずです。

何かのようなもの:

<cfcomponent namespace="http://#cgi.host_name#/api/v1n1/bsapi.cfc">
于 2009-07-13T15:12:33.210 に答える
0

同じ localhost (ただし、別のフォルダー) にあるテスト スクリプトによって localhost から Web サービスを CFINVOKE しようとすると、このエラー メッセージが表示されます。私にとっては「バグ」に聞こえます。

于 2010-08-30T18:19:51.957 に答える