0

RESTful Web サービスに ac# クライアント アプリケーションを作成しようとしています。

Web 参照 ( ServiceReference1) をクライアント アプリケーションに追加しましたが、'UserService1.svc' のエンドポイント構成が存在しないなどのエラーが発生します。

Rest サービスを使用する場合、「サービス参照の追加」が必要なすべての構成を作成しないことは承知していますが、どこが間違っているのか本当にわかりません!

ここに私のファイルがあります

クライアント アプリケーション

namespace WebServiceClient
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        UserService1Client webService;
        List<User> userList = new List<User>();

        public MainWindow()
        {
            InitializeComponent();            
            webService = new UserService1Client();
            serviceMethods();
        }

        private void serviceMethods()
        {
            string[] results = webService.GetUsersNames();
        }
    }
}

クライアント -web.config

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <startup>
    <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" />
  </startup>
  <system.serviceModel>
    <bindings>
      <basicHttpBinding>
        <binding name="BasicHttpBinding_IUserService1" />
      </basicHttpBinding>
    </bindings>
    <client>
      <endpoint address="http://localhost:53215/UserService1.svc" binding="basicHttpBinding"
        bindingConfiguration="BasicHttpBinding_IUserService1" contract="ServiceReference1.IUserService1"
        name="BasicHttpBinding_IUserService1" />
    </client>

  </system.serviceModel>

</configuration>

サービス - Web.config

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <configSections>    
  </configSections>
  <system.web>
    <compilation debug="true" targetFramework="4.0">
    </compilation>
  </system.web>
  <system.serviceModel>
    <services>
      <service name="WcfRestSample.UserService1">
        <endpoint address="" contract="WcfRestSample.IUserService1" binding="webHttpBinding" behaviorConfiguration="restBehavior"/>
      </service>
    </services>
    <behaviors>
      <endpointBehaviors>
        <behavior name="restBehavior">
          <webHttp/>
        </behavior>
      </endpointBehaviors>
      <serviceBehaviors>
        <behavior>
          <serviceMetadata httpGetEnabled="true"/>
          <serviceDebug includeExceptionDetailInFaults="true" />
        </behavior>
      </serviceBehaviors>
    </behaviors>
    <serviceHostingEnvironment multipleSiteBindingsEnabled="true" />
  </system.serviceModel>
  <system.webServer>
    <modules runAllManagedModulesForAllRequests="true" />
  </system.webServer>
  <connectionStrings>
      <add name="cs4_databaseEntities" connectionString="metadata=res://*/cs4_model.csdl|res://*/cs4_model.ssdl|res://*/cs4_model.msl;provider=System.Data.SqlClient;provider connection string=&quot;data source=.\SQLEXPRESS;attachdbfilename=|DataDirectory|\cs4_database.mdf;integrated security=True;user instance=True;MultipleActiveResultSets=True;App=EntityFramework&quot;" providerName="System.Data.EntityClient" />
  </connectionStrings>
</configuration>

IUserService.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Serialization;
using System.ServiceModel;
using System.ServiceModel.Web;
using System.Text;

namespace WcfRestSample
{
    // NOTE: You can use the "Rename" command on the "Refactor" menu to change the interface name "IUserService1" in both code and config file together.
    [ServiceContract]
    public interface IUserService1
    {
        [OperationContract]
        [WebGet(ResponseFormat = WebMessageFormat.Xml)]
        List<string> GetUsersNames();
    }
}

UserService1.svc

using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Serialization;
using System.ServiceModel;
using System.Text;

namespace WcfRestSample
{
    // NOTE: You can use the "Rename" command on the "Refactor" menu to change the class name "UserService1" in code, svc and config file together.
    // NOTE: In order to launch WCF Test Client for testing this service, please select UserService1.svc or UserService1.svc.cs at the Solution Explorer and start debugging.
    public class UserService1 : IUserService1
    {
        public List<string> GetUsersNames()
        {
            using (cs4_databaseEntities entities = new cs4_databaseEntities())
            {
                return entities.Users.Select(user => user.Name).ToList();
            }
        }
    }
}

うまくいけば、誰かがここで私を助けてくれます!!

4

1 に答える 1

1

まず RESTFUL サービスの場合、basichttpbinding ではなく、webhttpbinding を宣言する必要があります (これは SOAP サービス用です)。REST サービスには、次の構成が必要です。

1) サービスとそのエンドポイントを宣言する

<services>
    <service name="SparqlService.SparqlService" behaviorConfiguration="ServiceBehavior">
        <endpoint binding="webHttpBinding" contract="SparqlService.ISparqlService" behaviorConfiguration="webHttp" />
    </service>
</services>

サービス名は [プロジェクト名].[サービス名] になります 動作設定は次のステップで宣言する動作と同じ名前になります Binding は REST にしたいので webHttpBinding にする必要があります。SOAP が必要な場合は、basicHttpBinding として宣言します。Contract は [プロジェクト名].[インターフェイス名] です。エンドポイントでの動作構成は、次のステップで宣言する名前になります。

2) サービスの動作を宣言する (通常はデフォルト)

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

動作名は何でもかまいませんが、手順 1 で宣言した BehaviorConfiguration と一致させるために使用されます。残りはそのままにしておきます

3) エンドポイントの動作を宣言する

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

Beavior 名は何でもかまいませんが、エンドポイントの behaviorConfiguration と一致させるために使用されます。

最終的に、単純な REST サービスの web.config は次のようになります。

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <system.web>
        <compilation debug="true" targetFramework="4.0" />
    </system.web>
    <system.serviceModel>
        <services>
            <service name="SparqlService.SparqlService" behaviorConfiguration="ServiceBehavior">
                <endpoint binding="webHttpBinding" contract="SparqlService.ISparqlService" behaviorConfiguration="webHttp" />
            </service>
        </services>
        <behaviors>
            <serviceBehaviors>
                <behavior name="ServiceBehavior">
                    <serviceMetadata httpGetEnabled="true" />
                    <serviceDebug includeExceptionDetailInFaults="false" />
                </behavior>
                <behavior>
                    <!-- To avoid disclosing metadata information, set the value below to false and remove the metadata endpoint above before deployment -->
                    <serviceMetadata httpGetEnabled="true" />
                    <!-- To receive exception details in faults for debugging purposes, set the value below to true.  Set to false before deployment to avoid disclosing exception information -->
                    <serviceDebug includeExceptionDetailInFaults="false" />
                </behavior>
            </serviceBehaviors>
            <endpointBehaviors>
                <behavior name="webHttp">
                    <webHttp />
                </behavior>
            </endpointBehaviors>
        </behaviors>
    </system.serviceModel>
    <system.webServer>
        <modules runAllManagedModulesForAllRequests="true" />
    </system.webServer>
</configuration>

web.config が完了すると、これはサンプルの WCF REST サービスとそれぞれの C# クライアントになります。

POST または PUT を介してデータを送信するには、WCF サービスに従ってデータを正しく構築する必要があります。これが基本的に必要なものです(アプリケーションの POST を PUT に変更するだけです)

1) WCF サービス インターフェイス

[OperationContract]
[WebInvoke(Method = "POST",
    UriTemplate = "GetData",
    RequestFormat = WebMessageFormat.Xml,
    BodyStyle = WebMessageBodyStyle.Bare)]
string GetData(DataRequest parameter);

2) WCF サービスの実装

public string GetData(DataRequest parameter)
{
    //Do stuff
    return "your data here";
}

3) WCF サービスのデータ コントラクト (この場合は DataRequest)

[DataContract(Namespace = "YourNamespaceHere")]
public class DataRequest
{
    [DataMember]
    public string ID{ get; set; }
    [DataMember]
    public string Data{ get; set; }
}

4) データを送信するクライアントは、適切に構築されたデータを持っている必要があります! (この場合は C# コンソール アプリ)

static void Main(string[] args)
{
    ASCIIEncoding encoding = new ASCIIEncoding();
    string SampleXml = "<DataRequest xmlns=\"YourNamespaceHere\">" +
                                    "<ID>" +
                                    yourIDVariable +
                                    "</ID>" +
                                    "<Data>" +
                                    yourDataVariable +
                                    "</Data>" +
                                "</DataRequest>";

    string postData = SampleXml.ToString();
    byte[] data = encoding.GetBytes(postData);

    string url = "http://localhost:62810/MyService.svc/GetData";

    string strResult = string.Empty;

    // declare httpwebrequet wrt url defined above
    HttpWebRequest webrequest = (HttpWebRequest)WebRequest.Create(url);
    // set method as post
    webrequest.Method = "POST";
    // set content type
    webrequest.ContentType = "application/xml";
    // set content length
    webrequest.ContentLength = data.Length;
    // get stream data out of webrequest object
    Stream newStream = webrequest.GetRequestStream();
    newStream.Write(data, 0, data.Length);
    newStream.Close();

    //Gets the response
    WebResponse response = webrequest.GetResponse();
    //Writes the Response
    Stream responseStream = response.GetResponseStream();

    StreamReader sr = new StreamReader(responseStream);
    string s = sr.ReadToEnd();

    return s;
}
于 2013-11-14T18:36:01.550 に答える