4

次のインターフェースを設定しました。

[ServiceContract]
public interface IService1
{
  [OperationContract]
  String Ping();
}

その実装は次のとおりです。

public class Service1 : IService1
{
  public string Ping(){ return "Pong"; }
}

VSのテストアプリケーションによると、呼び出されたときに正しく機能しています。私の問題は、 http:// localhost:12345 / Service1.svc(またはService1.svc?PingまたはService.svc / Ping )と入力したときにテキストを画面に表示したいということです。それは完全にオフですか、それとも私は正しい木を吠えていますか?

もちろん、「Pong」は最終的にXML構造になります。

編集

以下の@carlosfigueiraによる返信で提示されたセットアップは、解決策の提案に適切な構造を提供しますが、残念ながら、F5を使用して実行すると、私のマシンでエラーメッセージが表示されます。メタデータが必要であり、エンドポイントについても同じことが言えるようです。

4

2 に答える 2

9

私はついに完全にPOになり、ビジネスに完全に連絡を取りました。これは私が作成したものです-それは私のマシンで動作し、それが局所的な現象ではないことを願っています。:)

IRestService.cs-宣言、あなたのコードが連絡先のクライアントに約束するもの

[ServiceContract]
public interface IRestService
{
  [OperationContract]
  [WebInvoke(Method = "GET", 
    ResponseFormat = WebMessageFormat.Xml, 
    BodyStyle = WebMessageBodyStyle.Wrapped, 
    UriTemplate = "xml/{id}")]
  String XmlData(String id);

  [OperationContract]
  [WebInvoke(Method = "GET", 
    ResponseFormat = WebMessageFormat.Json, 
    BodyStyle = WebMessageBodyStyle.Wrapped, 
    UriTemplate = "json/{id}")]
  String JsonData(String id);
}

RestService.svc.cs-実装、コードが実際にクライアントに対して行うこと

public class RestService : IRestService
{
  public String XmlData(String id)
  {
    return "Requested XML of id " + id;
  }

  public String JsonData(String id)
  {
    return "Requested JSON of id " + id;
  }
}

Web.config-構成、クライアントに向かう途中でコードがどのように処理されるか

<configuration>

  <system.web>
    <compilation debug="true" targetFramework="4.0" />
  </system.web>

  <system.serviceModel>
    <services>
      ...
    </services>
    <behaviors>
    </behaviors>
  </system.serviceModel>

</configuration>

services-サービスの性質を説明するタグの内容

<service name="DemoRest.RestService" 
         behaviorConfiguration="ServiceBehavior">
  <endpoint address="" binding="webHttpBinding" 
            contract="DemoRest.IRestService" 
            behaviorConfiguration="web"></endpoint>
</service>

動作-サービスの動作とエンドポイントを説明するタグの内容

<serviceBehaviors>
  <behavior name="ServiceBehavior">
    <serviceMetadata httpGetEnabled="true"/>
    <serviceDebug includeExceptionDetailInFaults="true"/>
  </behavior>
</serviceBehaviors>

<endpointBehaviors>
  <behavior name="web">
    <webHttp/>
  </behavior>
</endpointBehaviors>

Index.html-エグゼキュータ、コードを次のように呼び出すことができます

<html>
  <head>
    <script>
      ...
    </script>
    <style>
      ...
    </style>
  </head>
  <body>
    ...
  </body>
</html>

script -JavaScriptで実行可能ファイルを説明するタグの内容

window.onload = function () {
  document.getElementById("xhr").onclick = function () {
    var xhr = new XMLHttpRequest();
    xhr.onload = function () { alert(xhr.responseText); }
    xhr.open("GET", "RestService.svc/xml/Viltersten");
    xhr.send();
  }
}

style-外観を説明するタグの内容

.clickable
{
  text-decoration: underline;
  color: #0000ff;
}

body-マークアップ構造を説明するタグの内容

<ul>
  <li>XML output <a href="RestService.svc/xml/123">
    <span class="clickable">here</span></a></li>
  <li>JSON output <a href="RestService.svc/json/123">
    <span class="clickable">here</span></a></li>
  <li>XHR output <span id="xhr" class="clickable">here</span></li>

すべてがと呼ばれるプロジェクトに保存されDemoRestます。サービスの宣言と実装のために独自のファイルを作成し、デフォルトのファイルを削除しました。のディレクティブとusingXMLバージョン宣言は、空間的な理由から省略されています。

これで、次のURLを使用して応答を取得できます。

localhost:12345/RestService.svc/xml/Konrad
localhost:12345/RestService.svc/json/Viltersten
  1. 他の誰かがそれを機能させるのですか?
  2. 改善または明確化に関する提案はありますか?
于 2012-11-12T14:55:48.040 に答える
1

サービスエンドポイントをWebHttpエンドポイント(別名RESTエンドポイント)として定義すると、必要なものが得られます。これを行う最も簡単な方法はWebServiceHostFactory、svcファイルでを使用することです。

Service1.svc。

<%@ ServiceHost Language="C#" Debug="true" Service="YourNamespace.Service1"
                Factory="System.ServiceModel.Activation.WebServiceHostFactory" %>

webHttpBindingまたは、を使用して<webHttp/>動作することを定義することにより、ファクトリなしでエンドポイントを定義できます。

<system.serviceModel>
  <behaviors>
    <endpointBehaviors>
      <behavior name="MyBehavior">
        <webHttp/>
      </behavior>
    </endpointBehaviors>
  </behaviors>
  <services>
    <service name="YourNamespace.Service1">
      <endpoint address=""
                behaviorConfiguration="MyBehavior"
                binding="webHttpBinding"
                contract="YourNamespace.IService1" />
    </service>
  </services>
</system.serviceModel>

更新:一部の人々が問題を抱えていたので、私はXMLHttpRequest上記のサービスと話すために使用する完全な例を書きました。コードはhttps://github.com/carlosfigueira/WCFQuickSamples/tree/master/WCFForums/QuickWebCode1(StackOverflow_13345557を探してください)にあり、ほとんどがここにリストされています。

サービスコード(応答としてJSONを使用していることに注意してください。ただし、XMLも同様に機能します):

namespace StackOverflow_13345557
{
    [ServiceContract]
    public interface IService1
    {
        [WebGet(ResponseFormat = WebMessageFormat.Json)]
        string Ping();
        [WebGet(ResponseFormat = WebMessageFormat.Json)]
        string PingWithParameters(int a, string b);
    }

    public class Service1 : IService1
    {
        public string Ping()
        {
            return "Hello";
        }

        public string PingWithParameters(int a, string b)
        {
            return string.Format("Hello {0} - {1}", a, b);
        }
    }
}

.SVCファイル-Factory構成を介してエンドポイントを定義しているため、属性が使用されていないことに注意してください。

<%@ ServiceHost Language="C#" Debug="true" Service="StackOverflow_13345557.Service1"
                CodeBehind="StackOverflow_13345557.svc.cs" %>

web.config

<system.serviceModel>
  <services>
    <service name="StackOverflow_13345557.Service1">
      <endpoint address=""
                behaviorConfiguration="WithWebHttp"
                binding="webHttpBinding"
                bindingConfiguration="WithJSONP"
                contract="StackOverflow_13345557.IService1" />
    </service>
  </services>
  <behaviors>
    <endpointBehaviors>
      <behavior name="WithWebHttp">
        <webHttp/>
      </behavior>
    </endpointBehaviors>
  </behaviors>
  <bindings>
    <webHttpBinding>
      <binding name="WithJSONP" crossDomainScriptAccessEnabled="true" />
    </webHttpBinding>
  </bindings>
</system.serviceModel>

HTMLページアクセスサービス(本文のみ):

<body>
    <script type="text/javascript">
        function StackOverflow_13345557_Test(passParameters) {
            var baseUrl = "/StackOverflow_13345557.svc";
            var cacheBuster = new Date().getTime(); // to prevent cached response; development only
            var url;
            if (passParameters) {
                url = baseUrl + "/PingWithParameters?a=123&b=john+doe&_=" + cacheBuster;
            } else {
                url = baseUrl + "/Ping?_=" + cacheBuster;
            }
            var xhr = new XMLHttpRequest();
            xhr.onreadystatechange = function () {
                if (xhr.readyState == 4) {
                    document.getElementById("result").innerText = xhr.responseText;
                }
            }

            xhr.open('GET', url, true);
            xhr.send();
        }
    </script>
    <input type="button" value="StackOverflow 13345557 (no params)" onclick="StackOverflow_13345557_Test(false);" /><br />
    <input type="button" value="StackOverflow 13345557 (with params)" onclick="StackOverflow_13345557_Test(true);" /><br />
    <div id='result'></div>
</body>

もう1つの更新: https://skydrive.live.com/redir?resid = 99984BBBEC66D789!6355に、上記のコードを使用して、自己完結型の最小限のプロジェクトを追加しました。

于 2012-11-12T14:43:48.680 に答える