none
WCFをIISでホストするには RRS feed

  • 質問

  •  

    現在WCFの勉強をはじめました。

    とりあえずWCFサービスライブラリを作成し、WcfSvcHostで動作の確認まではできたのですが、

    http://blogs.wankuma.com/katamari/archive/2008/04/07.aspxを参照してIISにホストさせようと

    しているのですが途中でエラーがでてしまいます。

    エラーの内容はWCFサービスアプリケーションをブラウザで表示しようとした時に

    ”複数の要求本文パラメータがラッパー要素を使用せずにシリアル化されるように指定されています

    ラッパー要素を使用せずにシリアル化できる本文パラメータは最大で 1 つです。余分な本文パラメータを削除するか、

    または  WebGetAttribute/WebInvokeAttribute の BodyStyleo プロパティを Wrapped に設定してください。”

    なのですが、どうやら複数のパラメータを渡す処理が原因のようです。

    WebGetAttributeをヘルプで調べたりしたのですが、どのように解決できるのかまったくわかりませんでした。

     

    複数のパラメータを渡すってこと自体ができないのでしょうか?

    解決方法もしくは参考になる情報がありましたら教えていただけないでしょうか?

     

    環境はローカルのXPでVisualStudio2008のProfessionalのトライアル版にて開発、IISは5.1です。

    以上 よろしくお願いします。

     

     

    2008年7月17日 9:29

回答

  • ありがとうございました!!

    ようやくブラウザで表示ができるようになりました。

     

    SVCファイルをWCFサービスライブラリの方に項目の追加で作成していました。

    教えていただいたとおりウェブサイトプロジェクト(WCFサービスアプリケーション)を追加し、

    そのプロジェクトのSVSファイルに

    <%@ ServiceHost Language="VB" Debug="true" Service="WcfServiceLibrary1.Service1"  %>

    と設定し、そのプロジェクトでのWeb.configを

       <system.serviceModel>
        <services>
         <service behaviorConfiguration="WcfServiceLibrary1.ServiceBehavior"
        name="WcfServiceLibrary1.Service1">
          <endpoint address="" binding="basicHttpBinding" contract="WcfServiceLibrary1.IService1">
          </endpoint>
         </service>
        </services>
        <behaviors>
         <serviceBehaviors>
          <behavior name="WcfServiceLibrary1.ServiceBehavior">
           <serviceMetadata httpGetEnabled="true" />
          </behavior>
         </serviceBehaviors>
        </behaviors>
       </system.serviceModel>
    にしたところうまくいくようになりました。

    これからIDE外で実行してみます。

     

    基本がわかっていないため、飲み込みが悪かったにもかかわらず、丁寧に教えていただき本当に感謝いたします。

    先ほど教えていただいたとおり今度はwsHttpBindingにも挑戦します。

    また、いつの日か私も回答できる立場になれるようにがんばります。

    本当にありがとうございました。

    2008年7月18日 4:25

すべての返信

  • リンクの先を参照に作成したとのことですが、よかったらサービスの定義とweb.configおsystem.serviceModelの部分を見せてもらえますか?

     

    RSS/ATOMの(配信IIS6上ですが)のサンプルは以下のサイトも参考になりませんか?

     

    http://handcraft.blogsite.org/ComponentGeek/ShowArticle/16.aspx

     

    http://www.atmarkit.co.jp/fdotnet/zissenwcf/zissenwcf_01/zissenwcf_01_01.html

    2008年7月17日 10:49
  • 早速の返信ありがとうございます。

    申し訳ありませんが、RSS/ATOMについてはあまりわかっておりません。

    Webサイトの更新情報を公開するというのがどのようなことなのかよくわかっていないのですが、

    やりたいことは、業務アプリケーションの作成でサーバー側の処理を

    WCFで作成したいということです。

    WCFをIISでホストすることができず、いろいろ探した結果リンク先にたどり着き試してみました。

    はじめたばかりで頓珍漢なことをやっているかもしれないのですがよろしくお願いします。

     

    下記がWeb.configのServiceModelの部分です

      <system.serviceModel>
        <behaviors>
          <endpointBehaviors>
            <behavior name="ServiceBehavior">
              <webHttp />
            </behavior>
          </endpointBehaviors>
          <serviceBehaviors>
            <behavior name="NewBehavior">
              <serviceMetadata httpGetEnabled="true" />
            </behavior>
          </serviceBehaviors>
        </behaviors>
        <bindings />
        <services>
          <service name="WcfServiceLibrary1.Service1">
            <endpoint address="" behaviorConfiguration="ServiceBehavior"
              binding="webHttpBinding" bindingConfiguration="" contract="WcfServiceLibrary1.IService1" />
          </service>
        </services>
      </system.serviceModel>

     

    サービスの定義は以下のようなものです

        Public Function GetDenpyo(ByVal PNen As Integer, ByVal PNo As Integer) As List(Of Denpyo) Implements IService1.GetDenpyo
            Dim BC As New BizCompo.ClassBC
            Dim DenpyoL As New List(Of Denpyo)
            Dim 伝票R As DataEntity.satotest3DataSet.伝票セットRow
            For Each 伝票R In BC.GetDenpyo(PNen, PNo)
                Dim Denpyor As New Denpyo
                Denpyor.Nen = 伝票R.年度
                Denpyor.DenpyoNo = 伝票R.伝票番号
                Denpyor.Tekiyo = 伝票R.摘要
                Denpyor.GyoNo = 伝票R.行番
                Denpyor.DrKamoku = 伝票R.借方科目
                Denpyor.DrKingaku = 伝票R.借方金額
                Denpyor.CrKamoku = 伝票R.貸方科目
                Denpyor.CrKingaku = 伝票R.貸方金額
                DenpyoL.Add(Denpyor)
            Next
            Return DenpyoL
        End Function

    WCFではDataSetの受渡しはバグがあるとかレスポンスがよくないといった情報をみたので

    WCFの内部ではDataSetを使用しクライアントとの受渡しの為に、データコントラクト(Denpyo)に変換して

    送っています。

    以上長くなってしまいましたがよろしくお願いします。

    2008年7月17日 23:58
  • 確認させてください。

    Web.configを見ると、webHttpBindingを使われていますが、処理としては、IEがクライアントで、AJAXのXmlHttpRequestを使用して、javascript上で取得したデータを表示する処理を行いたいということですか?

     

    WcfSvcHostで動作の確認とありますが、自己ホストではクライアントから、データを取得することができたことを確認できて、svcファイルを作成してIISでホストさせ、クライアントからデータを取得しようとしたらエラーが発生するようになったということですか?

     

    また、インターフェース側で定義されているGetDenpyoに設定しているアトリビュートは,

    [OperationContract]

    [WebGet]

    GetDenpyo(..)

     

    となてっているんですか?

    2008年7月18日 0:09
  • すみません。クライアントはWindowsFormです。

    ひとつのソリューションの中で最初にWCFライブラリを作って、そこにクライアントとして動かす予定の

    WindowsFormプロジェクトを追加しました。この段階でF5にて実行するとWcfSvcHostが自動で起動され

    WindowsFormにてGetDenpyoを使用して動作しました。

    これをID環境ではなく動作させようとしているのですが、WCFライブラリをホストするために

    IISを使おうとしました。

    そもそもWinFormから呼び出されるWCFのホストとしてIISを使うことが間違っているのでしょうか?

     

    WCFライブラリのGetDenpyoのインターフェイスは下記のようになっております。

        <OperationContract()> _
        Function GetDenpyo(ByVal PNen As Integer, ByVal PNo As Integer) As List(Of Denpyo)

     

    よくわかっておらず申し訳ありませんがよろしくお願いします。

    2008年7月18日 0:43
  • WCFサービスライブラリを作成すると、configファイルに自動的にWCFの構成(たしかbasicHttpBinding)が設定されるので、動作したんだと思います。なので、例外の件は気にせず、バインディングを正しく構成するようにしたほうがよいです。

     

    WindowsFormがクライアントでIISにホストされたWCFサービスを呼び出すことはありうることだと思います。

    その場合は、webHttpBindingではなく、特に制約がない場合はwsHttpBindingを使用し、ASP.NET XML Web サービスと

    互換性を保持する必要がある場合はbasicHttpBindingを使うとよいと思います。

     

    basicHttpBindingを使ったIISをホストする構成は以下のサイトを参考に構成できると思います。少し構成を変えればwsHttpBindingを使うように変更できます。wsHttpBindingのほうが多機能なので、wsHttpBindingをお勧めします。

     

    http://handcraft.blogsite.org/ComponentGeek/ShowArticle/7.aspx

     

    わからなければ聞いてください。

    2008年7月18日 1:03
  • 教えていただいたサイトを参考にやってみましたが、今度は

    サービス 'WcfServiceLibrary1.Service1' には、アプリケーション (インフラストラクチャ以外) エンドポイントが 1 つもありません。これは、アプリケーション用の構成ファイルが見つからなかったこと、サービス名と一致するサービス要素が構成ファイル内から見つからなかったこと、またはサービス要素内でエンドポイントが定義されていないことが原因である可能性があります。

    というエラーが出てしまいました。

    そこで教えていただきたいのですが、

    教えていただいたサイトの5.のsvcファイルにアクセスするところですが
    アドレスはhttp://localhost/Wcfservice1/WcfServiceLibrary1.svc
    Localhostの後のWcfservice1はIISで追加した仮想フォルダの名前で良いのでしょうか?

    次のWcfServiceLibrary1.svcは4.で追加したテキストファイルの名前で良いのでしょうか?

    それと下記はWcfServiceLibrary1(プロジェクト名)のWeb.configですが

     

    <?xml version="1.0" encoding="utf-8" ?>
    <configuration>
     <system.web>
      <compilation debug="true" />
     </system.web>
     <!-- When deploying the service library project, the content of the config file must be added to the host's
      app.config file. System.Configuration does not support config files for libraries. -->
     <system.serviceModel>
      <services>
       <service behaviorConfiguration="WcfServiceLibrary1.ServiceBehavior"
         name="Service">
        <endpoint address="" binding="basicHttpBinding" contract="IService">
        </endpoint>
       </service>
      </services>
      <behaviors>
       <serviceBehaviors>
        <behavior name="WcfServiceLibrary1.ServiceBehavior">
         <serviceMetadata httpGetEnabled="true" />
        </behavior>
       </serviceBehaviors>
      </behaviors>
     </system.serviceModel>
    </configuration>
    ここで太字にした部分はクラス作成時にnamespaceを付けていないのでこのような表記でよいのでしょうか?

    申し訳ありませんが教えていただけないでしょうか?

     

    2008年7月18日 2:30
  •  mottys36 さんからの引用

    そこで教えていただきたいのですが、

    教えていただいたサイトの5.のsvcファイルにアクセスするところですが
    アドレスはhttp://localhost/Wcfservice1/WcfServiceLibrary1.svc
    Localhostの後のWcfservice1はIISで追加した仮想フォルダの名前で良いのでしょうか?

    仮想フォルダ名です。

     

     mottys36 さんからの引用

    次のWcfServiceLibrary1.svcは4.で追加したテキストファイルの名前で良いのでしょうか?

    そのとおりです。ウェブサイトプロジェクトを作ったと思うのですが、そこで作成したsvcファイルです。VBで作っているようなので、ネームスペースがない場合は以下のようになると思います。

     

    Code Snippet

    <%@ServiceHost Service="Service" Language="VB" %>

     

     

     mottys36 さんからの引用

    それと下記はWcfServiceLibrary1(プロジェクト名)のWeb.configですが

    ...

    ここで太字にした部分はクラス作成時にnamespaceを付けていないのでこのような表記でよいのでしょうか?

    申し訳ありませんが教えていただけないでしょうか?

    ネームスペースなしで動作確認したことんがないので、確証はないですが、大丈夫だと思います。

       <service behaviorConfiguration="WcfServiceLibrary1.ServiceBehavior"
         name="Service">

    のnameとsvcファイルのServiceで指定する名前は同じ、サービスコントラクトを実装したクラスの完全名(ネームスペース+クラス名)にしてください。これで動くと思うのですが。動作しませんでしたか?

    2008年7月18日 3:26
  • ありがとうございました!!

    ようやくブラウザで表示ができるようになりました。

     

    SVCファイルをWCFサービスライブラリの方に項目の追加で作成していました。

    教えていただいたとおりウェブサイトプロジェクト(WCFサービスアプリケーション)を追加し、

    そのプロジェクトのSVSファイルに

    <%@ ServiceHost Language="VB" Debug="true" Service="WcfServiceLibrary1.Service1"  %>

    と設定し、そのプロジェクトでのWeb.configを

       <system.serviceModel>
        <services>
         <service behaviorConfiguration="WcfServiceLibrary1.ServiceBehavior"
        name="WcfServiceLibrary1.Service1">
          <endpoint address="" binding="basicHttpBinding" contract="WcfServiceLibrary1.IService1">
          </endpoint>
         </service>
        </services>
        <behaviors>
         <serviceBehaviors>
          <behavior name="WcfServiceLibrary1.ServiceBehavior">
           <serviceMetadata httpGetEnabled="true" />
          </behavior>
         </serviceBehaviors>
        </behaviors>
       </system.serviceModel>
    にしたところうまくいくようになりました。

    これからIDE外で実行してみます。

     

    基本がわかっていないため、飲み込みが悪かったにもかかわらず、丁寧に教えていただき本当に感謝いたします。

    先ほど教えていただいたとおり今度はwsHttpBindingにも挑戦します。

    また、いつの日か私も回答できる立場になれるようにがんばります。

    本当にありがとうございました。

    2008年7月18日 4:25