我正在为我制作的Windows服务构建一个插件(它是C#,使用插件来执行某些功能)。这个新插件将使用Web服务来调用Web服务并获取一些信息。
不幸的是,我的DEV,QC和PRODUCTION环境的Web服务URL是不同的。我想让端点URL可配置(插件将查看数据库并获取URL)。
如何在我的代码中设置一个Web服务调用者,以便它可以使用动态端点?
我可以添加一个服务并指向DEV中的现有服务 - 并构建我的代理类 - 但是我怎样才能使它不被“硬锁定” - 所以插件可以在任何环境中工作(基于它拔出的数据库中的URL)?我希望能够在代码中动态更改它,可以这么说。
答案 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;