2

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

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

Soooo,具体到这里!

我有下面的代码。有用。在 VS 中,您添加一个 Web 引用,在下面编写代码,然后....开始摆弄 app.config。

它有效。

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

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

2 回答 2

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通常表示一个接口,如果一个全职开发人员要查看您的项目,乍一看可能会让他们有点困惑。

于 2013-09-25T04:46:36.060 回答
1

使用 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

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

于 2014-05-13T20:18:47.763 回答