【问题标题】:unable to add refrence of restful wcf service in windows service无法在windows服务中添加restful wcf服务的引用
【发布时间】:2013-09-24 12:39:33
【问题描述】:

当我尝试将restful wcf服务的引用添加到windows服务时。我收到“找不到类型或命名空间名称'RestfulService'(您是否缺少 using 指令或程序集引用?)”错误。

我的界面是

[ServiceContract(Name = "RJContract",
     Namespace = "RestfulService",
     SessionMode = SessionMode.Allowed)]
    public interface IService1
    {
        [OperationContract]
        [WebGet(UriTemplate = "/rjdata/{name}")]
        string RJData(string name);
    }

App.Config

<system.serviceModel>
    <services>
      <service name="RestfulService.Service1">
        <host>
          <baseAddresses>
            <add baseAddress = "http://localhost:8732/RestfulService/Service1/" />
          </baseAddresses>
        </host>
        <endpoint  binding="webHttpBinding" contract="RestfulService.IService1" bindingConfiguration="RESTBindingConfiguration"
                   behaviorConfiguration="RESTEndpointBehavior"/>

      </service>
    </services>



    <bindings>
      <webHttpBinding>
        <binding name="RESTBindingConfiguration">
          <security mode="None" />
        </binding>
      </webHttpBinding>

      <netTcpBinding>
        <binding name="DefaultBinding">
          <security mode="None"/>
        </binding>
      </netTcpBinding>

    </bindings>



    <behaviors>
      <endpointBehaviors>
        <behavior name="RESTEndpointBehavior">
          <webHttp helpEnabled="true" defaultOutgoingResponseFormat="Json" automaticFormatSelectionEnabled="true"/>
        </behavior>
      </endpointBehaviors>

      <serviceBehaviors>
        <behavior>
          <serviceMetadata httpGetEnabled="True"/>
          <serviceDebug includeExceptionDetailInFaults="False" />
        </behavior>
      </serviceBehaviors>
    </behaviors>
    <serviceHostingEnvironment multipleSiteBindingsEnabled="true" aspNetCompatibilityEnabled="true" />
  </system.serviceModel>

但我可以添加以下引用。

 [ServiceContract(Name = "RJContract",
         Namespace = "RestfulService",
         SessionMode = SessionMode.Allowed)]
        public interface IService1
        {
            [OperationContract]
            string RJData(string name);
        }

在 Windows 主机中

public partial class Service1 : ServiceBase
    {
        public Service1()
        {
            InitializeComponent();
        }
        ServiceHost sHost;
        protected override void OnStart(string[] args)
        {
            try
            {
                sHost = new ServiceHost(typeof(RestfulService.Service1));
                sHost.Open();
            }
            catch (Exception ex)
            {
                EventLog.WriteEntry(ex.Message);
            }
        }

        protected override void OnStop()
        {
        }
    }

RestfulService 是我对 wcf 服务的引用

【问题讨论】:

  • 添加服务引用是指您尝试通过Visual Studio的添加服务引用添加服务吗?如果是这样,那么您不能对 RESTful 服务执行此操作;您不使用代理与 RESTful 服务进行通信,而是使用 HTTP API 直接通过 HTTP 进行调用。
  • 你不能。需要使用一些服务器/客户端 api 来使用您的服务,它可以执行 http get/post,如果可以从客户端/Javascript 端调用,可以使用 jquery ajax,如果需要在 C# 端使用服务,则使用 HttpWebRequest。
  • @Tim:- 我正在添加项目作为参考
  • @LearningNeverEnds:- 我将使用 javascript 在客户端使用它。但首先我想将它托管在 Windows 服务中
  • @Gangadhar - 它的托管方式(IIS、Windows 服务、自托管)与您访问它的方式无关。如果你想在 Windows 服务中托管它,你需要编写逻辑来托管服务 - 你不需要引用服务来托管它。

标签: c# wcf rest windows-services wcf-rest


【解决方案1】:

要添加和使用对服务库的引用,您需要在 Windows 服务项目中添加对服务库程序集的引用,然后将 using RestfulService 语句添加到 Windows 服务代码中的 using 指令中。

另外,由于您想使用 REST,我建议您使用 WebServiceHost 而不是 ServiceHost

using RestfulService;

public partial class Service1 : ServiceBase
{

    public Service1()
    {
        InitializeComponent();
    }

    WebServiceHost sHost;

    protected override void OnStart(string[] args)
    {
        try
        {
            sHost = new WebServiceHost(typeof(RestfulService.Service1));
            sHost.Open();
        }
        catch (Exception ex)
        {
            EventLog.WriteEntry(ex.Message);
        }
    }

    protected override void OnStop()
    {
        sHost.Close();
    }
}    

【讨论】:

    【解决方案2】:

    您被 SOAP 和 REST 的重叠标准弄糊涂了。
    RESTful 风格的服务不遵循 SOAP 标准。 VS 中的添加引用功能下载基于 SOAP 的服务的元数据(包括 WSDL),以了解其合约/绑定/等。但是,在基于 REST 的服务的情况下,这些标准/机制不适用,并且可能不会发布正式的元数据以供消费者发现和生成代理。
    要调用 REST 服务,您需要手动创建一个可以访问该服务的代理。您可以使用 HttpWebRequest/WebClient 之类的类。

    【讨论】:

      【解决方案3】:

      默认情况下,添加引用时不支持 rest 服务(webhttp 绑定)。 如果要添加引用,可以添加一个肥皂端点,然后尝试添加引用。然后就可以了。

      如果你想调用restful服务那么你可以这样做

      protected void Page_Load(object sender, EventArgs e)
              {   
      WebRequest request = WebRequest.Create("https://192.168.1.118/PracticeWcfService1/Service1.svc/RestTypeWithSecure/GetProductData");
                      ServicePointManager.ServerCertificateValidationCallback = new System.Net.Security.RemoteCertificateValidationCallback(AcceptAllCertifications);
                      WebResponse ws = request.GetResponse();
              string text;
      using (var sr = new StreamReader(ws.GetResponseStream()))
                  {
                      text = sr.ReadToEnd();
      }
      
              Response.write(text );
      }
      

      【讨论】:

        猜你喜欢
        • 2014-05-08
        • 1970-01-01
        • 2016-03-07
        • 2012-02-15
        • 2020-08-20
        • 2017-05-25
        • 2011-05-17
        • 1970-01-01
        • 2015-04-15
        相关资源
        最近更新 更多