如何使用web.conf在c#中创建web服务

本文关键字:web 创建 服务 何使用 conf | 更新日期: 2023-09-27 18:22:02

我对C#世界还很陌生,所以我知道的不多。我甚至找不到关于如何在不使用Visual Studio中的内置模板的情况下设置简单服务的简单分步文档。

我更喜欢使用下面的类和web.conf来制作我的服务。我不想使用任何依赖visual Studio或IIS魔术的.asmx文件。

我似乎无法让我的服务器对此做出响应。当我转到localhost:8152/02/service或localhost:8152/002/service/echo2时,我会得到一个404错误。

我的web.conf文件中有以下内容。

<system.serviceModel>
  <services>
    <service name ="hessian.test.HessianService" behaviorConfiguration="HttpGetMetadata">
      <host>
      <baseAddresses>
        <add baseAddress="http://localhost:8152/02/service"/>
      </baseAddresses>
    </host>
      <endpoint address="/echo2" contract="hessian.test.HessianService.sayHello" binding="wsHttpBinding"/>
    </service>
   </services>
    <behaviors>
      <serviceBehaviors>
        <behavior name ="HttpGetMetadata">
          <serviceMetadata httpGetEnabled="true"/>
        </behavior>
      </serviceBehaviors>
    </behaviors>
    <bindings />
    <client />
</system.serviceModel> 

这在我的.cs文件中

namespace hessian.test{
public class HessianService : WebService, testInterface
{
    public void runVoid(int count)
    {
    }
    public string sayHello()
    {
        return "Hello";
    }
    public string repeatMe(string s)
    {
        return s;
    }
  }
}

如有任何帮助,我们将不胜感激

如何使用web.conf在c#中创建web服务

我建议看一下WCF入门。WCF使用.svc文件而不是.asmx进行操作。以下是比较。

在您的示例中,您需要创建这样的合同:

using System.IO;
using System.ServiceModel;
using System.ServiceModel.Web;
namespace WcfService1
{
    [ServiceContract]
    public interface IService
    {
        [OperationContract]
        [WebGet(UriTemplate = "sayhello")]
        Stream SayHello();
    }
}

然后一个实现可以是这样的:

using System.IO;
using System.ServiceModel.Web;
using System.Text;
namespace WcfService1
{
    public class Service : IService
    {
        public Stream SayHello()
        {
            WebOperationContext.Current.OutgoingResponse.ContentType = "text/plain";
            return new MemoryStream(Encoding.UTF8.GetBytes("hello"));
        }
    }
}

当然,所有重要的web.config,注意serviceHostingEnvironment元素,如果你不想创建.svc文件,它是必需的,尽管.svc文件不需要IIS,但你可以在任何地方托管它。

    <system.serviceModel>
        <services>
            <service name="WcfService1.Service">
                <endpoint address="" binding="webHttpBinding" contract="WcfService1.IService"/>
            </service>
        </services>
        <behaviors>
            <serviceBehaviors>
                <behavior>
                    <serviceMetadata httpGetEnabled="true" httpsGetEnabled="true"/>
                    <serviceDebug includeExceptionDetailInFaults="true"/>
                </behavior>
            </serviceBehaviors>
            <endpointBehaviors>
                <behavior>
                    <webHttp/>
                </behavior>
            </endpointBehaviors>
        </behaviors>
        <serviceHostingEnvironment>
            <serviceActivations>
                <add factory="System.ServiceModel.Activation.ServiceHostFactory" relativeAddress="./sayhello.svc" service="WcfService1.Service"/>
            </serviceActivations>
        </serviceHostingEnvironment>
    </system.serviceModel>

在服务工作之前,你需要做好以下几件事:

  • ServiceContractOperationContract分别应用于服务和操作声明
  • WebGet属性应用于操作,以便它响应GET请求
  • 配置servicebehaviors,以便WCF可以读取它们并适当地处理事情

WCF功能强大,但它也有很多优点,这就是我最初建议WebApi的原因。它有一个更温和的学习曲线,假设您想使用REST而不是SOAP。还有NancyFx和ServiceStack 等替代方案