none
SL如何通过Console宿主访问WCF RRS feed

  • 问题

  •  

    这是控制台

     static void Main(string[] args)
            {

                Uri baseAddress = new Uri("http://localhost:8001/");

                ServiceHost Host = new ServiceHost(typeof(MyProcess), baseAddress);

                Host.AddServiceEndpoint(typeof(IMyProcess), new BasicHttpBinding(), "http://localhost:8001/");

                ServiceMetadataBehavior smb = new ServiceMetadataBehavior();
                smb.HttpGetEnabled = true;
                Host.Description.Behaviors.Add(smb);

                Host.Open();
                Console.WriteLine("The manual WCF is running at " + baseAddress.ToString() + "WCF");

                Console.WriteLine("Press <ENTER> to terminate");
                Console.ReadLine();
                Host.Close();
            }  

     

    这是服务接口

    {  
     
        [ServiceContract]  
     
        interface IMyProcess  
     
        {  
     
            [OperationContract]  
     
            int Add(int a, int b);  
     
        }  
     
        }

     

    服务实现

            class MyProcess : IMyProcess
            {

                public int Add(int a, int b)
                {

                   // Console.WriteLine("Received Add({0},{1}) Returnning:{2}", a, b, a + b);

                    return a + b;

                }

            } 

    2008年11月15日 10:12

答案

  • 照着那篇通讯介绍我ok了呀,原来有密保滴

    方法跟我先前想的差不多,就是生成一个ClientAccessPolicy.xml放在web server root下,只是具体生成办法没想好,他给出来了呀

    建一个ClientAccessPolicy.xml文件,

    Code Snippet



       
           
               
                   
               
               
                   
               
           
       

     

     

    放在跟你console.exe同级目录下,其他的照着那个博客把代码都贴进去就行了

     

    CrossDomainService就是流出书这个访问策略文件

     

    MyService是你的wcf逻辑

     

    还要注意app.config 把你提供网址的设置贴进去就ok了

     

    Code Snippet

    using System.Xml;
    using System.ServiceModel.Channels;
     
    namespace AccessAServiceFromConsoleApplication
    {
        public class CrossDomainService : ICrossDomainService
        {
            public System.ServiceModel.Channels.Message ProvidePolicyFile()
            {
                FileStream filestream = File.Open(@"ClientAcessPolicy.xml", FileMode.Open);
                // Either specify ClientAcessPolicy.xml file path properly
                // or put that in \Bin folder of the console application
                XmlReader reader = XmlReader.Create(filestream);
                System.ServiceModel.Channels.Message result = Message.CreateMessage(MessageVersion.None, "", reader);
                return result;
            }
        }
    }

     

     

    上面这段代码在文章中有个小错误,文件名少了个c,其他的就都没啥问题了

    2008年11月20日 16:14
    版主
  • Code Snippet

    <?xml version="1.0" encoding="utf-8"?>
    <access-policy>
        <cross-domain-access>
            <policy>
                <allow-from http-request-headers="*">
                    <domain uri="*"/>
                </allow-from>
                <grant-to>
                    <resource path="/" include-subpaths="true"/>
                </grant-to>
            </policy>
        </cross-domain-access>
    </access-policy>

     

     

    贴xml还有xaml的时候总有很诡异问题 上面那个白的xml
    2008年11月20日 16:16
    版主

全部回复

  • 这个没研究过了,用Console为什么不用Socket呢?

     

    2008年11月15日 11:25
    版主
  •  

    wcf是对外,对内的话用ipc或者内存共享

    Socket存在着防火墙穿透问题,有时候很麻烦。

    2008年11月15日 11:33
  • 一起求等解答吧,楼主的帖子有点错误帮你给改了下,策略文件我试了好些地方都不太行

    2008年11月15日 12:36
    版主
  •  

    版主大哥您研究研究?我看不懂SDK啊= =!
    2008年11月15日 12:38
  •  

    需要使用svcutil.exe进行编译

    svcutil.exe /language:c# http://localhost:8001

     

    把编译好的 2个文件拷贝过去

    配置文件就该成Project的配置文件

    2008年11月15日 12:41
  • 如果项目中用到还是先用Web 的 WCF吧,这个问题我也在帮你问.等待高手ing
    2008年11月16日 2:43
    版主
  • 我是新手呵呵~楼上做俯卧撑的高手!..

     

    WCF你为什么不做服务引用再进行强名称的实例化而非要自己写呢?这岂不很费劲?

     

     

    你先在VisualStudio里面 添加服务引用:

    http://localhost:8001/你的svc.svc

     

    然后引用命名空间,之后直接实例化

    MyProcess M = new MyProcess();

     

    你还可以重新绑Host Address..反正我从来不用ServiceHost动态搞...楼主很有科学家风范..

     

    我是真的新手,估计是楼主比较高深了,我看不懂吧~

    2008年11月17日 10:59
  • console做wcf的host,winform asp.net可以认,SilverLight需要一个策略跨域访问文件,这个不知道怎么加,是这个问题

    2008年11月17日 11:03
    版主
  •  

    刚刚`看了八爪熊的话才反应过来原来是Host!!

     

    跨域策略文件应该放在IIS根目录下..但是Console的就..估计应该是一样的吧`毕竟也是HTTP://...:。。

     

     

    策略文件

     

    crossdomain.xml

    Code Snippet

     


    http://www.macromedia.com/xml/dtds/cross-domain-policy.dtd">

     
     

     

     

     

     

     

    clientaccesspolicy.xml

     

    Code Snippet

    <?xml version="1.0" encoding="utf-8"?>
    <access-policy>
        <cross-domain-access>
            <policy>
                <allow-from http-request-headers="*">
             <domain uri="*"/>
           </allow-from>

                <grant-to>
                    <resource path="/" include-subpaths="true"/>
                </grant-to>
            </policy>
        </cross-domain-access>
    </access-policy>

     

     


    2008年11月17日 11:07
  • Struggle-luan

     

    没成功过.按网上说的 所有策略xml都试过了 : (

    能添加到地方都添加进去了。

     

     

     

    2008年11月17日 12:17
  • So Sad...

     

    看看你是怎么访问这个WCF的可以么~?

    2008年11月17日 12:18
  •         private void Btn1_Click(object sender, RoutedEventArgs e)
            {
                EndpointAddress prot = new EndpointAddress("http://localhost:8001");
                wcf.SVClient ws = new Sl.wcf.SVClient(new BasicHttpBinding(), prot);
                ws.GetStringCompleted += new EventHandler<Sl.wcf.GetStringCompletedEventArgs>(ws_GetStringCompleted);
                ws.GetStringAsync();

            }
            private void ws_GetStringCompleted(object sender, wcf.GetStringCompletedEventArgs e)
            {
                HtmlWindow html = HtmlPage.Window;
                html.Alert(e.Error.Message);
                sttac.Text += e.Result;

            }

     

    这是 sl里的

    服务就是直接添加引用

    2008年11月17日 12:25
  •  private void Btn1_Click(object sender, RoutedEventArgs e)
            {
                wcf.SVClient ws = new Sl.wcf.SVClient();
                ws.GetStringCompleted += new EventHandler<Sl.wcf.GetStringCompletedEventArgs>(ws_GetStringCompleted);
                ws.GetStringAsync();

            }


    当然这样也一样就是

    2008年11月17日 12:31
  • 能不能直接在Host里加载配置文件呢?..郁闷

    2008年11月17日 12:43
  • 试过了,我是没加进去,在IIS里面配置一样的web,启动console是不认这个web的.继续期待ing

    2008年11月17日 14:43
    版主
  • 这个问题其实很简单,用自定义协意的方式通过Silverlight的Socket与本地Console的Socket程序通信,然后Console把访问WCF的结果以自定义协意的方式返回Silverlight,但不建意这样做,这样部署难度大,还要加大系统开销……等等不利因素。

    2008年11月18日 5:40
  • 这篇文章就是介绍通信的

     

    http://www.dotnetcurry.com/(X(1)S(ewrymx3vxswvbtrrrvvajr45))/ShowArticle.aspx?ID=208&AspxAutoDetectCookieSupport=1

     

    jacoblai 提供的:)这是他的博客http://blog.csdn.net/jacle169/archive/2008/11/18/3322753.aspx

     

    增加一个Web服务类型来读取跨域xml

     

    但是我看完了还是无法访问

     

    版主研究下?我E文不行看到不太明白。

    2008年11月20日 12:22
  • 照着那篇通讯介绍我ok了呀,原来有密保滴

    方法跟我先前想的差不多,就是生成一个ClientAccessPolicy.xml放在web server root下,只是具体生成办法没想好,他给出来了呀

    建一个ClientAccessPolicy.xml文件,

    Code Snippet



       
           
               
                   
               
               
                   
               
           
       

     

     

    放在跟你console.exe同级目录下,其他的照着那个博客把代码都贴进去就行了

     

    CrossDomainService就是流出书这个访问策略文件

     

    MyService是你的wcf逻辑

     

    还要注意app.config 把你提供网址的设置贴进去就ok了

     

    Code Snippet

    using System.Xml;
    using System.ServiceModel.Channels;
     
    namespace AccessAServiceFromConsoleApplication
    {
        public class CrossDomainService : ICrossDomainService
        {
            public System.ServiceModel.Channels.Message ProvidePolicyFile()
            {
                FileStream filestream = File.Open(@"ClientAcessPolicy.xml", FileMode.Open);
                // Either specify ClientAcessPolicy.xml file path properly
                // or put that in \Bin folder of the console application
                XmlReader reader = XmlReader.Create(filestream);
                System.ServiceModel.Channels.Message result = Message.CreateMessage(MessageVersion.None, "", reader);
                return result;
            }
        }
    }

     

     

    上面这段代码在文章中有个小错误,文件名少了个c,其他的就都没啥问题了

    2008年11月20日 16:14
    版主
  • Code Snippet

    <?xml version="1.0" encoding="utf-8"?>
    <access-policy>
        <cross-domain-access>
            <policy>
                <allow-from http-request-headers="*">
                    <domain uri="*"/>
                </allow-from>
                <grant-to>
                    <resource path="/" include-subpaths="true"/>
                </grant-to>
            </policy>
        </cross-domain-access>
    </access-policy>

     

     

    贴xml还有xaml的时候总有很诡异问题 上面那个白的xml
    2008年11月20日 16:16
    版主
  • 版主能发份你调试成功的打包 到我的邮箱吗sttac@qq.com

     

    跨域来跨去的 晕死了。

    看网上等下这等下那的 看到实在是头晕

     

    刚刚才学wcf呵~很多搞不明白

    2008年11月20日 16:34
  • 给你发过去了

     

    2008年11月21日 1:24
    版主
  • 谢谢版主:)

     

    2008年11月21日 6:11
  • 客气,下次直接把问题连带出处一起发出来啦,呵呵,就不至于水了两页啦,问题也就早解决了嘛

    2008年11月21日 7:01
    版主
  • 出处是我的大脑,那篇英文解答的是1个星期后别人帮我找到的:)

     

    你发给我的的 还是跨域出错 - -!写的是跟我一样,我是通过Html来访问wcf的

     

    然道是说sl不支持嵌入html访问么?

    2008年11月21日 7:07
  • 喔,厉害,偶就没找到。不会啊,我给你发那个我测了啊,sl跟winform的wcf都通过了

    2008年11月21日 7:10
    版主
  •  九星 写:

    出处是我的大脑,那篇英文解答的是1个星期后别人帮我找到的:)

     

    你发给我的的 还是跨域出错 - -!写的是跟我一样,我是通过Html来访问wcf的

     

    然道是说sl不支持嵌入html访问么?

     

     

    http://localhost:8731/MyService

     

    web引用上面这个地址,我稍微改了一下,他的文件名太长了,不知道项目怎么取的名称,我取那么长的名字报错

    2008年11月21日 7:16
    版主
  •  

    代码发你邮箱上了。

     

    论坛不能上传附件么?

     

    感觉这样很难说的清楚:)
    2008年11月21日 7:21
  • 又给你回了个附件,你本地文件的html访问不了跨域的东西,新建了一个web application项目,然后引用silverlight就可以访问你的wcf hosting了

    2008年11月21日 7:33
    版主
  • 终于好了= =!最终结果还是要Web服务器

     

    原来我理解的一直不对。我一直以为可以直接就连接Wcf的 =。=#

    2008年11月21日 7:35