gpt4 book ai didi

c# - 是否可以创建完全包含在 .svc 文件中的 ASP.NET Web 服务?

转载 作者:太空宇宙 更新时间:2023-11-03 14:24:53 27 4
gpt4 key购买 nike

是否可以创建“插入式”网络服务?我想做的是创建一个 .svc 文件,该文件可以放在 IIS 上的 Web 目录中并通过其 URL 访问(和执行),而无需安装任何其他文件,也无需更改任何配置文件。

我正在调查允许上传 .svc 文件的 Web 应用程序中可能存在的安全问题。如果可以上传并执行 .svc 文件,这将是该应用程序的一个大安全问题。不幸的是,我不是 .NET 开发人员,所以我可能在这里遗漏了很多东西。

我知道可以在“服务主机”指令之后将服务接口(interface)和实现直接放入 .svc 文件中。这是我的 .svc 文件:

<%@ ServiceHost Language = "C#" Debug = "true" Service = "EchoService" %>
public interface IEchoService
{
string Hello();
}

public class EchoService : IEchoService
{
public string Hello()
{
return "Hello";
}
}

现在当我访问 http://localhost/test1.svc 时我从 .NET 得到一个异常:服务“EchoService”有零个应用程序(非基础设施)端点。这可能是因为没有为您的应用程序找到配置文件,或者因为在配置文件中找不到与服务名称匹配的服务元素,或者因为没有在服务元素中定义端点。

我知道通常您应该在 web.config 或 app.config 文件中配置 Web 服务端点。通过一些谷歌搜索,我还了解到可以通过定义您自己的 ServiceHost 和 ServiceCodeFactory 以编程方式配置端点。我找到了一些示例,但无法使它们正常工作。

如果有人能告诉我“不,你试图做的事情是不可能的,因为......”或者展示我如何将必要的代码添加到上面的示例以获得可执行服务,我将非常感激。

更新:根据 Josh 的建议,我终于让它工作了。有关工作代码,请参阅下面的答案。

最佳答案

好的,我得到了一个包含在 .svc 文件中的工作 SOAP Web 服务。这是代码:

<%@ ServiceHost 
Language = "C#"
Debug = "true"
Factory="Hello.CustomServiceHostFactory"
Service = "Hello.HelloService" %>

using System;
using System.ServiceModel;
using System.ServiceModel.Activation;

namespace Hello
{

public class CustomServiceHostFactory : ServiceHostFactory
{

public override System.ServiceModel.ServiceHostBase CreateServiceHost(string constructorString, Uri[] baseAddresses)
{
return base.CreateServiceHost(constructorString, baseAddresses);
}

protected override ServiceHost CreateServiceHost(Type serviceType, Uri[] baseAddresses)
{
CustomHost host = new CustomHost(serviceType, baseAddresses);

//configure customServiceHost here

host.AddServiceEndpoint(typeof(IHelloService), new BasicHttpBinding(), "");

var smb = host.Description.Behaviors.Find <System.ServiceModel.Description.ServiceMetadataBehavior>();
if(smb == null)
{
// add the "get metadata" behavior
// This will allow the service to emit WSDL when tickled at the right HTTP endpoint
smb= new System.ServiceModel.Description.ServiceMetadataBehavior();
smb.HttpGetEnabled = true;
host.Description.Behaviors.Add(smb);
}
return host;
}
}

public class CustomHost : ServiceHost
{

public CustomHost()
{
}

public CustomHost(Type serviceType, params Uri[] baseAddresses)
: base(serviceType, baseAddresses)
{
}


public CustomHost(object singeltonInstance, params Uri[] baseAddresses)
: base(singeltonInstance, baseAddresses)
{
}

protected override void ApplyConfiguration()
{
base.ApplyConfiguration();
}
}

[ServiceContract(Namespace="http://www.example.com")]
public interface IHelloService
{
[OperationContract]
string Hello();
}

public class HelloService : IHelloService
{
public string Hello() {
return "Hello";
}
}
}

它适用于 .NET 4,不确定以前的版本。

关于c# - 是否可以创建完全包含在 .svc 文件中的 ASP.NET Web 服务?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4347724/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com