我在这篇文章中以通用方式尝试了这个问题:https://stackoverflow.com/q/18968846/147637
但这并没有让我们得到结果。
Soooo,具体来说就是这里!
我有以下代码。有用。在VS中,您添加了一个Web引用,代码如下,然后....开始摆弄app.config。
它有效。
但我需要摆脱app配置。问题是代码的关键部分不在....代码中。很难记录,并且很容易让看到这个例子的人忘记查看app配置(这是其他开发人员的一个例子)。
所以问题是:如何将app.config的内容移动到代码中?
(我是兼职编辑的一部分。指着我的通用文档不会让我在那里,抱歉说!)
**// .cs file:**
using myNameSpace.joesWebService.WebAPI.SOAP;
namespace myNameSpace
{
class Program
{
static void Main(string[] args)
{
// create the SOAP client
joesWebServerClient server = new joesWebServerClient();
string payloadXML = Loadpayload(filename);
// Run the SOAP transaction
string response = server.WebProcessShipment(string.Format("{0}@{1}", Username, Password), payloadXML);
=================================================
**app.config**
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" />
</startup>
<system.serviceModel>
<bindings>
<basicHttpBinding>
<!-- Some non default stuff has been added by hand here -->
<binding name="IjoesWebServerbinding" maxBufferSize="256000000" maxReceivedMessageSize="256000000" />
</basicHttpBinding>
</bindings>
<client>
<endpoint address="http://joesWebServer/soap/IEntryPoint"
binding="basicHttpBinding" bindingConfiguration="IjoesWebServerbinding"
contract="myNameSpace.joesWebService.WebAPI.SOAP.IjoesWebServer"
name="IjoesWebServerSOAP" />
</client>
</system.serviceModel>
</configuration>
答案 0 :(得分:3)
一般来说,配置文件比硬编码设置更受欢迎,因为您需要对配置文件执行的操作是更改要更改的值,然后重新启动应用程序。如果它们是硬编码的,则必须修改源代码,重新编译并重新部署。
话虽如此,您可以在WCF的配置文件中执行代码中的所有操作(我似乎记得一些例外,但不记得它们。)
实现您正在寻找的内容的一种方法是在代码中定义绑定并通过ChannelFactory<T>
创建客户端,其中T
是您服务的接口(更准确地说是服务合同) ,通常在一个接口中,然后由一个类实现。
例如:
using System.ServiceModel;
using myNameSpace.joesWebService.WebAPI.SOAP;
namespace myNameSpace
{
class Program
{
static void Main(string[] args)
{
// Create the binding
BasicHttpBinding myBinding = new BasicHttpBinding();
myBinding.MaxBufferSize = 256000000;
myBinding.MaxReceivedMessageSize = 256000000;
// Create the Channel Factory
ChannelFactory<IjoesWebServer> factory =
new ChannelFactory<IjoesWebServer>(myBinding, "http://joesWebServer/soap/IEntryPoint");
// Create, use and close the client
IjoesWebService client = null;
string payloadXML = Loadpayload(filename);
string response;
try
{
client = factory.CreateChannel();
((IClientChannel)client).Open();
response = client.WebProcessShipment(string.Format("{0}@{1}", Username, Password), payloadXML);
((IClientChannel)client).Close();
}
catch (Exception ex)
{
((ICientChannel)client).Abort();
// Do something with the error (ex.Message) here
}
}
}
现在您不需要配置文件。您在示例中的其他设置现在位于代码中。
ChannelFactory<T>
的优点是,一旦您创建了工厂实例,您就可以通过调用CreateChannel()
随意生成新渠道(将其视为客户端)。这将加快速度,因为大部分开销都来自工厂的创建。
附加说明 - 您在配置文件中的很多位置使用I<name>
。 I
通常表示一个界面,如果一个全职开发人员要查看你的项目,乍看之下可能会让他们有些困惑。
答案 1 :(得分:1)
如果向WCF服务类添加静态配置方法,则会自动加载并忽略app.config文件中的内容。
<ServiceContract()>
Public Interface IWCFService
<OperationContract()>
Function GetData(ByVal value As Integer) As String
<OperationContract()>
Function GetDataUsingDataContract(ByVal composite As CompositeType) As CompositeType
End Interface
Public Class WCFService
Implements IWCFService
Public Shared Function CreateClient() As Object
End Function
Public Shared Sub Configure(config As ServiceConfiguration)
'Define service endpoint
config.AddServiceEndpoint(GetType(IWCFService), _
New NetNamedPipeBinding, _
New Uri("net.pipe://localhost/WCFService"))
'Define service behaviors
Dim myServiceBehaviors As New Description.ServiceDebugBehavior With {.IncludeExceptionDetailInFaults = True}
config.Description.Behaviors.Add(myServiceBehaviors)
End Sub
Public Function GetData(ByVal value As Integer) As String Implements IWCFService.GetData
Return String.Format("You entered: {0}", value)
End Function
Public Function GetDataUsingDataContract(ByVal composite As CompositeType) As CompositeType Implements IWCFService.GetDataUsingDataContract
End Function
End Class
我仍然在研究如何为客户做同样的事情。如果有任何兴趣,我会在我弄清楚的时候尝试更新。