以编程方式确定C#中Web服务的端点

时间:2011-09-15 15:06:14

标签: c# wcf web-services

我正在为我制作的Windows服务构建一个插件(它是C#,使用插件来执行某些功能)。这个新插件将使用Web服务来调用Web服务并获取一些信息。

不幸的是,我的DEV,QC和PRODUCTION环境的Web服务URL是不同的。我想让端点URL可配置(插件将查看数据库并获取URL)。

如何在我的代码中设置一个Web服务调用者,以便它可以使用动态端点?

我可以添加一个服务并指向DEV中的现有服务 - 并构建我的代理类 - 但是我怎样才能使它不被“硬锁定” - 所以插件可以在任何环境中工作(基于它拔出的数据库中的URL)?我希望能够在代码中动态更改它,可以这么说。

4 个答案:

答案 0 :(得分:3)

基本上你可以调用它来创建你的WCF服务客户端:

MyClient = new MyWCFClient(new BasicHttpBinding("CustomBinding"), new EndpointAddress(GetEndpointFromDatabase()));

GetEndpointFromDatabase()返回string - 端点。

答案 1 :(得分:1)

我结束了在LINQPad中运行的结束示例。这是一个完全自托管的场景,可以探索各种绑定等(对于客户端和服务器)。希望它不会超过顶部并发布整个样本,以防您在以后发现任何其他方面有用。


void Main()
{
    MainService();
}
// Client
void MainClient()
{
    ChannelFactory cf = new ChannelFactory(new WebHttpBinding(), "http://localhost:8000");
    cf.Endpoint.Behaviors.Add(new WebHttpBehavior());
    IService channel = cf.CreateChannel();
    Console.WriteLine(channel.GetMessage("Get"));
    Console.WriteLine(channel.PostMessage("Post"));
    Console.Read();
}
// Service
void MainService()
{
    WebServiceHost host = new WebServiceHost(typeof(Service), new Uri("http://localhost:8080"));
    ServiceEndpoint ep = host.AddServiceEndpoint(typeof(IService),new WebHttpBinding(), "");
    ServiceDebugBehavior stp = host.Description.Behaviors.Find();
    stp.HttpHelpPageEnabled = false;
    stp.IncludeExceptionDetailInFaults = true;
    host.Open();
    Console.WriteLine("Service is up and running");
    Console.ReadLine();
    host.Close();    
}
// IService.cs
[ServiceContract]
public interface IService
{
    [OperationContract]
    [WebInvoke(Method="GET", BodyStyle = WebMessageBodyStyle.Bare, RequestFormat = WebMessageFormat.Json, ResponseFormat = WebMessageFormat.Json)]
    string GetMessage(string inputMessage);

    [OperationContract]
    [WebInvoke(Method="POST", BodyStyle = WebMessageBodyStyle.Bare, RequestFormat = WebMessageFormat.Json, ResponseFormat = WebMessageFormat.Json)]
    string PostMessage(string inputMessage);

    [OperationContract]
    [WebInvoke(Method="POST", BodyStyle = WebMessageBodyStyle.Bare, RequestFormat = WebMessageFormat.Json, ResponseFormat = WebMessageFormat.Json)]
    System.IO.Stream PostJson(System.IO.Stream json);
}
// Service.cs
public class Service : IService
{
    public string GetMessage(string inputMessage){
        Console.WriteLine(inputMessage);
        return "Calling Get for you " + inputMessage;
    }
    public string PostMessage(string inputMessage){
        Console.WriteLine(inputMessage);
        return "Calling Post for you " + inputMessage;
    }
    public System.IO.Stream PostJson (System.IO.Stream json) {
        Console.WriteLine(new System.IO.StreamReader(json).ReadToEnd());
        return json;
    }
}

答案 2 :(得分:0)

你不能把URI放在.config文件中吗?您可以通过在.debug.config和.release.config中使用不同的URI来更改调试或发布时的URI。

答案 3 :(得分:0)

只需设置网址

即可
TheWebservice.Url = TheUrlFromTheDatabase;