none
2.0应用程序调用WCF服务时的用户名密码问题 RRS feed

  • 问题

  • 我的WCF服务,用的是基于证书的传输安全和消息安全机制,自定义用户名密码验证

    我的客户端应用程序是framework2.0的,在visual studio里添加服务引用以后,自动生成了代码

    但是提示如下消息:

    未能找到元素“supportedRuntime”的架构信息
    未能找到特性“version”的架构信息
    未能找到元素“applicationSettings”的架构信息
    未能找到元素“aaa.Properties.Settings”的架构信息
    未能找到元素“setting”的架构信息
    未能找到特性“name”的架构信息
    未能找到特性“serializeAs”的架构信息
    未能找到元素“value”的架构信息

    这并没有影响编译

    调用远程方法的代码:

          aaa.WSHttpBinding_IBasicData proxy = new aaa.WSHttpBinding_IBasicData();
          term = proxy.GetCurrentTerm().TermNo.Substring(0, 4);
    
    但是我的服务是有自定义用户名密码验证的,请问我应该在哪里填写用户名和密码?
    2011年2月27日 13:18

全部回复

  • WCFClient.ClientProxy.WCFServiceClient wcfServiceProxyHttp = new WCFClient.ClientProxy.WCFServiceClient("WSHttpBinding_IWCFService"); //通过代理调用SayHello服务 string sName = "Frank Xu Lei Transport Basic WSHttpBinding"; string sResult = string.Empty; //设置Windows用户和密码 wcfServiceProxy.ClientCredentials.UserName.UserName = "Administrator"; wcfServiceProxy.ClientCredentials.UserName.Password = "00000000"; Util.SetCertificatePolicy();//强制信任证书。重写验证服务端证书的方法。 sResult = wcfServiceProxyHttp.SayHello(sName); Console.WriteLine("Returned Result is {0}", sResult);
    Frank Xu Lei--谦卑若愚,好学若饥
    专注于.NET平台下分布式应用系统开发和企业应用系统集成
    Focus on Distributed Applications Development and EAI based on .NET
     

    老徐的网站】:http://www.frankxulei.com/

    微软WCF中文技术论坛
    微软WCF英文技术论坛

    Windows Azure中文技术论坛

    2011年2月28日 9:25
    版主
  • 参考这个代码

     WCFClient.ClientProxy.WCFServiceClient wcfServiceProxyHttp = new WCFClient.ClientProxy.WCFServiceClient("WSHttpBinding_IWCFService");
    //通过代理调用SayHello服务
    string sName = "Frank Xu Lei Transport Basic WSHttpBinding";
    string sResult = string.Empty;
    //设置Windows用户和密码
                    wcfServiceProxy.ClientCredentials.UserName.UserName = "Administrator";
                    wcfServiceProxy.ClientCredentials.UserName.Password = "00000000";
                    Util.SetCertificatePolicy();//强制信任证书。重写验证服务端证书的方法。
                    sResult = wcfServiceProxyHttp.SayHello(sName);
                    Console.WriteLine("Returned Result is {0}", sResult);


    Frank Xu Lei--谦卑若愚,好学若饥
    专注于.NET平台下分布式应用系统开发和企业应用系统集成
    Focus on Distributed Applications Development and EAI based on .NET
     

    老徐的网站】:http://www.frankxulei.com/

    微软WCF中文技术论坛
    微软WCF英文技术论坛

    Windows Azure中文技术论坛

    2011年2月28日 9:26
    版主
  • 谢谢

    您这个代码在2.0框架下能用么?我的客户端是2.0的框架

    2011年2月28日 9:52
  • 谢谢

    您这个代码在2.0框架下能用么?我的客户端是2.0的框架


    我没做过测试。

    但是之前写过Web Service的 用户名和密码验证。

    首先定义一下自己的MySOAPheader类,继承自SOAPheader.和web service一个项目.主要是传递用户的票据,自己可以实现更复杂的定义,包括用户名称和密码等

    WCF分布式开发必备知识(4):Web Service

    2.0 调用 WCF的你再Google一下


    Frank Xu Lei--谦卑若愚,好学若饥
    专注于.NET平台下分布式应用系统开发和企业应用系统集成
    Focus on Distributed Applications Development and EAI based on .NET
     

    老徐的网站】:http://www.frankxulei.com/

    微软WCF中文技术论坛
    微软WCF英文技术论坛

    Windows Azure中文技术论坛

    2011年3月1日 1:41
    版主
  • 我在网上找到的唯一方法,就是2.0下强制引用3.0框架里的System.Runtime.Serialization.dll和System.ServiceModel.dll两个文件 但这样做似乎是有缺陷的,wsHttpBinding依然是依赖于xml做数据交换的,那么理论上来说,仅依赖2.0框架里现有的东西,应该就可以实现通信 如果在.NET自身体系里,调用WCF都这么难,那其他平台比如JAVA、PHP、PB岂不是更难?
    2011年3月2日 7:49
  • 请求版主给出一个解决方案,我刚才试了强制引用dll的方法,不行

    我现在WCF服务已经写好了,使用对象可能是JAVA程序员,可能是PHP程序员,可能是PB程序员,也可能是.NET,我不希望我的东西白做了,那样真的很崩溃啊

    2011年3月2日 8:55
  • 期待版主的回复!!!!!!!!!
    2011年3月3日 5:37
  • 如果没有用到高级功能(例如回调),可以考虑在配置文件中添加一个basicHTTP的binding,并同时准备好mex。未原生支持WCF的程序可以通过WEBSERVICE的方式来通讯。
    Eternal Snow
    2011年3月4日 8:11
  • 期待版主的回复!!!!!!!!!


    这个肯定可以实现,不过我没写Demo。

    网上应该也有,你可以Google一下啊,老外肯定写了


    Frank Xu Lei--谦卑若愚,好学若饥
    专注于.NET平台下分布式应用系统开发和企业应用系统集成
    Focus on Distributed Applications Development and EAI based on .NET
     

    老徐的网站】:http://www.frankxulei.com/

    微软WCF中文技术论坛
    微软WCF英文技术论坛

    Windows Azure中文技术论坛

    2011年3月4日 11:50
    版主
  • 找了好几天,在下不才,没找到。。。

    我搜到解决方案有两种,一种是上面提到的,强制引用两个3.0下的dll,这个我试过了,编译可以通过,但是拿到只有2.0框架的电脑上,是无法运行的

    第二种这个应该不算是解决方案,说是添加一个basichttpbinding的终结点,但这样做与webservice有何区别?所以这个肯定不行

    真是很纠结的问题啊,客户端电脑是win2000,框架最高只能装到2.0

    版主你就写个DEMO吧,我真的一点招都没有了

    2011年3月6日 13:24
  • 为什么不用basichttpbinding呀?我看过的文章说如果希望你跨平台强的话 应该用basicbinding的 不然你的java client恐怕没法调用

    这个2.0的framework也太古老了 版主不可能给你写2.0的code吧 建议升级一下吧

    2011年3月7日 22:23
  • 用basicHttpBinding,还不如用webservice呢 basicHttpBinding没法实现身份验证啊
    2011年3月8日 12:43
  • 用basic的可以身份验证 我记得你说过你用的是selfhosted吧?你搜basichttpbinding username password有很多例子 e。g

    http://nirajrules.wordpress.com/2009/05/22/username-over-https-custombinding-with-wcf%E2%80%99s-channelfactory-interface/

    但是不清楚2.0的环境能不能用

    我怀疑你用wshttpbinding更java很难沟通的 我现在也有这个问题 不过我用的是iis 所以上面的sample不适用:(

    2011年3月8日 16:00
  •  刚才顺手search了一下 你试过这个么?

    http://freekleemhuis.com/2008/04/16/running-wcf-without-installing-net-framework-30/

    看了一些别人的观点 都说要么换webservice 要么升级 困难重重云云。。。

    2011年3月8日 16:16
  • 谢谢! 我试试你说的那个哈 现在越来越发现,微软是一个挺不负责任的企业 都是自己的产品,说不兼容就不兼容 framework对win2000只支持到2.0 EF对SQL2000不支持 wshttpbinding对2.0不支持 哎!!!有点失望的说
    2011年3月9日 8:58
  • 我看网上有文章介绍java调用wshttpbinding啊

    http://social.msdn.microsoft.com/Forums/zh-CN/wcf/thread/ee4fc07b-b053-4446-b416-ecb1dd04cc7b

    你会JAVA么?试试看?我不会那玩意

    basichttpbinding的username身份验证,你试成功了吗?怎么配置的?

     

    2011年3月9日 10:26
  • 我弄出来basicHttpBinding下的UserName身份验证了,这是我的配置文件,你看这个算不算?

    <?xml version="1.0" encoding="utf-8" ?>
    <configuration>
     <system.web>
      <compilation debug="true" />
     </system.web>
     <system.serviceModel>
      <services>
       <service name="TeachInfoPlatform.TeachInfoService" behaviorConfiguration="WCFService.WCFServiceBehavior">
        <host>
         <baseAddresses>
          <add baseAddress = "https://localhost:9000/" />
         </baseAddresses>
        </host>
        <endpoint address ="SysUserManage" binding="basicHttpBinding" contract="TeachInfoPlatform.SystemManageContract.ISysUserManage" 
    
    bindingConfiguration="bindingConfiguration">
        </endpoint>
        <endpoint address="BasicData" binding="basicHttpBinding" contract="TeachInfoPlatform.PublicContract.IBasicData" bindingConfiguration="bindingConfiguration"></endpoint>
        <endpoint address="LessonInfo" binding="basicHttpBinding" contract="TeachInfoPlatform.PublicContract.ILessonInfo" bindingConfiguration="bindingConfiguration"></endpoint>
        <endpoint address="RoomInfo" binding="basicHttpBinding" contract="TeachInfoPlatform.PublicContract.IRoomInfo" bindingConfiguration="bindingConfiguration"></endpoint>
        <endpoint address="StudentInfo" binding="basicHttpBinding" contract="TeachInfoPlatform.PublicContract.IStudentInfo" 
    
    bindingConfiguration="bindingConfiguration"></endpoint>
        <endpoint address="TeacherInfo" binding="basicHttpBinding" contract="TeachInfoPlatform.PublicContract.ITeacherInfo" 
    
    bindingConfiguration="bindingConfiguration"></endpoint>
        <endpoint address="ExperimentInfo" binding="basicHttpBinding" contract="TeachInfoPlatform.PublicContract.IExperimentInfo" 
    
    bindingConfiguration="bindingConfiguration"></endpoint>
        <endpoint address="mex" binding="mexHttpsBinding" contract="IMetadataExchange"/>
       </service>
      </services>
      <behaviors>
       <serviceBehaviors>
        <behavior name="WCFService.WCFServiceBehavior">
         <serviceMetadata httpsGetEnabled="True"/>
         <serviceDebug includeExceptionDetailInFaults="False" />
         <serviceCredentials>
          <serviceCertificate storeName="My" x509FindType="FindBySubjectName" findValue="localhost" storeLocation="LocalMachine"/>
          <clientCertificate>
           <authentication certificateValidationMode="None"/>
          </clientCertificate>
          <userNameAuthentication userNamePasswordValidationMode="Custom" customUserNamePasswordValidatorType="TeachInfoPlatform.UserPasswordValidator,TeachInfoPlatform"/>
         </serviceCredentials>
         <serviceAuthorization serviceAuthorizationManagerType="TeachInfoPlatform.TeachServiceAuthorizationManager,TeachInfoPlatform"/>
        </behavior>
       </serviceBehaviors>
      </behaviors>
      <bindings>
       <basicHttpBinding>
        <binding name="bindingConfiguration" useDefaultWebProxy="false">
         <security mode="TransportWithMessageCredential">
          <transport clientCredentialType="None"></transport>
          <message clientCredentialType="UserName"/>
         </security>
        </binding>
       </basicHttpBinding>
      </bindings>
     </system.serviceModel>
    </configuration>
    
    
     
    
    配置成这样,Java就可以访问了????2.0可以访问吗?访问的时候,用户名和密码往哪填?
    2011年3月9日 12:00
  • 你怎么才发现呀

    我现在stuck在用httpmodule里面呢 因为我们想用iis比较规范点 结果iis host不支持username的 只能自己写个httpmodule 写了很难加上去

    wcf的config很不好搞定 我现在都懒得看自己的code了

    我也不清楚java怎么回事 你找的那个文章里是不是特指需要某种java的方法?

    随手搜的:

    http://stackoverflow.com/questions/1139285/consuming-a-wcf-wshttpbinding-webservice-in-java

    Your problem is that JAX-WS doesn't support the same WS protocols that are used in the wsHttpBinding. You need to use WSIT instead. WSIT is available as part of the Metro library, which is also available on Glassfish.

    I recommend using wsHttpBinding or ws2007HttpBinding where possible, but you can still do a fairly secure service with basicHttpBinding over SSL/Transport Auth.

     

    2011年3月9日 16:38
  • 还有一个思路就是用wse 3,在2.0上面是支持的 具体行不行我就不清楚了

    http://www.microsoft.com/downloads/en/details.aspx?FamilyID=018A09FD-3A74-43C5-8EC1-8D789091255D

    做这个wcf我也觉得很烦 总是试来试去担心最后不成

    good luck!

    2011年3月9日 17:09
  • 我现在就是想知道,我上面那个config文件,已经用了basichttpbinding,能不能被JAVA支持

    .还有就是这个WSE,能不能被JAVA支持?

    哎,这贴版主都不进了,就咱俩在这回帖玩

    2011年3月10日 6:00
  • basicHttpBinding应该可以的。

     

    USerName 和Password以明文形式在消息头里 传递。

    这个应该是可以的,只要Java可以生成这样的SOAP消息即可。


    Frank Xu Lei--谦卑若愚,好学若饥
    专注于.NET平台下分布式应用系统开发和企业应用系统集成
    Focus on Distributed Applications Development and EAI based on .NET
     

    老徐的网站】:http://www.frankxulei.com/

    微软WCF中文技术论坛
    微软WCF英文技术论坛

    Windows Azure中文技术论坛

    2011年3月10日 12:42
    版主
  • 那个啥 我随便说2句

    似乎basichttpbinding的username方式不能用在2.0里面 小心噢

    提到wse是指的client端的 更java的支持没有关系 我真是很佩服你每种都去尝试 不过能少点麻烦不用最好

    还有提醒一下你 你加basic binding 原来的ws binding不用删的 没准怎么试着就能用了呢

    再就可以试一下加做web reference, 这样wcf就作为web service使用 那么一些更java接口或者2.0接口理论上应该可以用

    2011年3月10日 16:04
  • 谢谢版主的回复

    请问2.0和JAVA下怎么把UserName和Password以明文形式加在消息头里?

     

    2011年3月10日 16:09
  • 呵呵,我还是删了wshttpbinding

    我现在是一边做实验,一边给别的程序提供服务。

    2011年3月10日 16:11