WCF - 如何在C#代码中指定端点的契约?

时间:2009-11-11 16:15:50

标签: c# .net wcf

如何在C#代码中指定合约?我想删除对配置文件的依赖,并获得错误:

  

无法找到默认端点   引用合同的元素   “TFBIC.RCT.HIP。   Components.RCTBizTalk.WcfService_TFBIC_RCT_BizTalk_Orchestrations'   在Servic eModel客户端中   配置部分。这可能是   因为没有配置文件   找到您的申请,或因为   没有匹配此co的端点元素   ntract可以在客户端找到   元件。

<endpoint 
   address="http://nxwtest08bt1/TFBIC.RCT.BizTalk.Orchestrations/WcfService_TFBIC_RCT_BizTalk_Orchestrations.svc"
   binding="wsHttpBinding" 
   bindingConfiguration="WSHttpBinding_ITwoWayAsync"
   contract="TFBIC.RCT.HIP.Components.RCTBizTalk.WcfService_TFBIC_RCT_BizTalk_Orchestrations"
   name="WSHttpBinding_ITwoWayAsync">
   <identity>
      <userPrincipalName value="NXWTest08BT1\BTAdmin" />
   </identity>
</endpoint>

我第一次尝试使用ChannelFactory来指定通常隐藏在配置文件中的parms:

WSHttpBinding myBinding = new WSHttpBinding();

string webServiceURL = "http://localhost/TFBIC.RCT.BizTalk.Orchestrations/WcfService_TFBIC_RCT_BizTalk_Orchestrations.svc";
EndpointAddress myEndpoint = new EndpointAddress(webServiceURL);

ChannelFactory<WcfService_TFBIC_RCT_BizTalk_Orchestrations> myChannelFactory =
     new ChannelFactory<WcfService_TFBIC_RCT_BizTalk_Orchestrations>
         (myBinding, myEndpoint);

// Create a channel and call the web-service via the channel 
WcfService_TFBIC_RCT_BizTalk_Orchestrations wcfClient2 = 
                                       myChannelFactory.CreateChannel();
req.PolicyAction = polAction; 
resp = wcfClient2.WCFSubmitPolicyAction(req);
propResult = resp.PropertyValuation;

我正在使用Intellisense和myEndPoint变量,找不到像“contract”甚至“bindingConfiguration”这样的东西。

我正在做的是将.exe复制到新目录,并完全删除<system.serviceModel>元素/组。我想尝试完全没有配置文件运行。请参阅我的相关问题:NUnit tests that call .DLLs that call WCF Web Services (.NET C#)。我想跟随吉尔汉姆的回答,尽管我并不完全理解。我想到了解ChannelFactory如何工作是第一步。

谢谢,

Neal Walters

其他配置文件部分:

<wsHttpBinding>
   <binding 
      name="WSHttpBinding_ITwoWayAsync" closeTimeout="00:01:00"
      openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00"
      bypassProxyOnLocal="false" transactionFlow="false" 
      hostNameComparisonMode="StrongWildcard" 
      maxBufferPoolSize="524288" maxReceivedMessageSize="65536"
      messageEncoding="Text" textEncoding="utf-8" useDefaultWebProxy="true"
      allowCookies="false">
      <readerQuotas maxDepth="32" maxStringContentLength="8192" 
                    maxArrayLength="16384" maxBytesPerRead="4096" 
                    maxNameTableCharCount="16384" />
      <reliableSession ordered="true" inactivityTimeout="00:10:00"
                       enabled="false" />;
      <security mode="Message">
         <transport clientCredentialType="Windows" proxyCredentialType="None"
                            realm="" />;
         <message clientCredentialType="Windows" negotiateServiceCredential="true"
                  algorithmSuite="Default" establishSecurityContext="true" />
      </security>
   </binding>

<小时/> 在中部时间下午5点之后编辑2009年11月11日
根据@Marc_s在下面所说的内容,这个传奇继续存在,我想我终于想出了在定义渠道工厂时将合同纳入其中。早些时候,我正在寻找像endpoint.contract =“xxx”这样的东西,因为在Config文件中,合同似乎是端点的子参数。

        //Not-Fully Qualified Contract 
        //ChannelFactory<WcfService_TFBIC_RCT_BizTalk_Orchestrations> myChannelFactory =
        //     new ChannelFactory<WcfService_TFBIC_RCT_BizTalk_Orchestrations>(myBinding, myEndpoint);
        //Fully Qualified Contract 
        ChannelFactory<TFBIC.RCT.HIP.Components.RCTWebService.WcfService_TFBIC_RCT_BizTalk_Orchestrations> myChannelFactory =
             new ChannelFactory<TFBIC.RCT.HIP.Components.RCTWebService.WcfService_TFBIC_RCT_BizTalk_Orchestrations>(myBinding, myEndpoint);

为了进行上述编译,我还必须引用我的TBFIC.RCT.HIP.Components(我的.DLL Class-Library调用WCF服务)。

所以我尝试了上面的代码,当我有配置文件时运行正常,但是,当我删除配置时,我收到此错误:

  

无法找到默认端点   引用合同的元素   “TFBIC.RCT.HIP。   Components.RCTWebService.WcfService_TFBIC_RCT_BizTalk_Orchestrations'   在Ser viceModel客户端中   配置部分。这可能是   因为没有配置文件   找到您的申请,或因为   没有匹配此的端点元素   合同可以在客户端找到   元件。

现在,我仍然不知道我在删除配置文件的依赖项时做错了什么。我现在使用它抱怨的确切合同在channelFactory定义中丢失。再次感谢!

2 个答案:

答案 0 :(得分:1)

嗯,在代码中创建端点时,没有与在config中创建端点时完全相同的结构。

E.g。你没有在“绑定”类上设置“bindingConfiguration” - 你需要明确设置该bindingConfiguration中的所有内容。

你能告诉我们这个部分吗? (您引用的<bindingConfiguration>

合同是在您创建渠道工厂时定义的 - 我认为应该没问题,就我所知。

您获得的错误似乎表明代码的某些部分仍然尝试创建客户端代理类(很可能是在命令行上使用“添加服务引用”或svcutil.exe创建的)并且代码尝试从配置文件中读取配置。

马克

PS:我认为你现在应该没事了 - 你创建wsHttpBinding并使用所有默认值(如配置中),然后定义端点地址以指向托管服务的服务器,并在渠道工厂中指定正在使用的合同 - 这就是全部。该错误指向另一个仍在尝试从配置文件中读取的“流氓”客户端代理 - 您是否使用“添加服务引用”添加了引用?如果是这样,请从您的项目中删除该服务参考。

答案 1 :(得分:0)

我不知道这是否可行,但您是否真的计划硬编码值,如端点的URL,或安全凭证等等?这看起来对我来说真的很糟糕。

我们在这里做的是使用ChannelFactory在运行时根据我们在配置文件中保留的值生成代理。