如何摆脱 app.config 并将其全部移动到代码中

本文关键字:移动 全部 代码 何摆脱 app config | 更新日期: 2023-09-27 18:32:51

我在这篇文章中以通用的方式尝试了这个问题:https://stackoverflow.com/q/18968846/147637

但这并没有让我们得到结果。

所以,具体来说就是这里!

我有下面的代码。它有效。在 VS 中,您添加一个 Web 引用,编写以下内容,然后....开始摆弄应用程序。

它有效。

但是我需要摆脱应用程序配置。这是一个问题,代码的关键部分不在....法典。很难记录,而且看这个例子的人很容易忘记查看应用程序配置(这是其他开发人员的示例(。

所以问题是:如何将 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>

如何摆脱 app.config 并将其全部移动到代码中

一般来说,配置文件比硬编码设置更可取,因为您需要做的就是更改要更改的值,然后重新启动应用程序。 如果它们是硬编码的,则必须修改源代码,重新编译并重新部署。

话虽如此,您几乎可以在代码中执行在 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通常表示一个界面,如果全职开发人员要查看您的项目,乍一看可能会让他们感到困惑。

在 WCF 4.5 中,如果将静态配置方法添加到 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

我仍在研究如何为客户做同样的事情。 如果有兴趣,我会在弄清楚时尝试更新。