起名Silverlight+WCF 新手实例 象棋 WCF通讯跨域(十五)

当下节咱们把WCF独立一个劳务出来,不寄在Web应用程序中。

<form action="" target="frameFile">
  <mt-search v-model="value" placeholder="请输入关键字" @keyup.native.enter="search(value)">
    <div v-infinite-scroll="loadMore()" infinite-scroll-disabled="loading" infinite-scroll-distance="10">
      <ListItem :lists="lists"></ListItem>
      <div class="loading-text" v-if="(loadingTextBtn==true)"><mt-spinner v-if="(loadingComplete==false)" type="snake" :size="10"></mt-spinner></div>
    </div>
  </mt-search>
  <iframe name='frameFile' style="display: none;"></iframe>
</form>

咱俩重起一个门类来讲课,上节号叫Hellow,这节名称起World:

解决办法:

文本—》新建->项目-》Silverlight应用程序-》起名叫:World

mint-ui的search组件input默认也是type=”search”类型的,但是还需在他层保险一组form标签,并且带有action,就会见以键盘中起搜索按钮。

确定后要么:World和World.web应用程序,两独品种

倘齐是方式一致:

 

每当大哥大键盘点击搜索的时候,页面会刷新,所以受form加一个target,target规定在何方打开
action
URL,再放入一个隐蔽的iframe,起名为form的target的值,这样虽然当脚下页面显示起搜索的始末

咱本着正在解决方案右键,添加新建项目:建立WCF
服务应用程序->输入名称为:WorldService:

正如是法二:

起名 1

<form action="" v-on:submit.prevent=""

> <mt-search v-model="value" placeholder="请输入关键字" @keyup.native.enter="search(value)"> <div v-infinite-scroll="loadMore()" infinite-scroll-disabled="loading" infinite-scroll-distance="10"> <ListItem :lists="lists"></ListItem> <div class="loading-text" v-if="(loadingTextBtn==true)"><mt-spinner v-if="(loadingComplete==false)" type="snake" :size="10"></mt-spinner></div> </div> </mt-search> </form>

随即我们把默认的Service1.cs与Service1.svc删除:

此地直接让onsubmit事件写入return false,

起名 2

 onsubmit="return false;"

抹后,我们新建一个新的服务,叫Service.svc

禁止提交,但是由于是vue所以使用vue自带的submit阻止刷新事件,则搜索列表页也足以在手上页面显示。

起名 3

 

我们提前修改下服务之端口,这样加加服务引用后,不用再变更配置文件的端口。

以search方法中,加一个点击搜索按钮后软键盘收起底轩然大波:

起名 4

document.activeElement.blur();

吓了,现在咱们啊接口弄多一个术为GetWrold:

 

而新建一个实体类MyWorld,用于返回,关于实体类的头顶的达标标识,上节说过了就背着了。

参照文章:http://blog.csdn.net/github_39237934/article/details/75258285

起名 5起名 6

 

[ServiceContract]
    public interface IService
    {
        [OperationContract]
        MyWorld GetWorld(int id);
    }
    [DataContract]
    public class MyWorld
    {
        [DataMember]
        public int ID
        {
            get;
            set;
        }
         [DataMember]
        public string Name
        {
            get;
            set;
        }
    }

 

好,接下大概实现接口方法:

起名 7起名 8

public class Service : IService
    {
        #region IService 成员
        public MyWorld GetWorld(int id)
        {
            MyWorld world = new MyWorld();
            world.ID = id;
            world.Name = “Name is:” + id;
            return world;
        }
        #endregion
    }

 

OK,WCF服务章程就写了了啦,看,多简单。

今天客户端要调用了,还是如上节一模一样,添加服务引用:

起名 9

修改服务号也WorldService.确认后一致的初增加一个文本夹和一个布置文件。

此处的部署文件我们不要改端口号了,因为咱们提前装项目性质的捧口号了。

起名 10

OK,接着我们要如来一个暨上次一模一样的界面,来调用,从上节那里Copy来xaml的代码:

 

起名 11起名 12

 <Grid x:Name=”LayoutRoot” Background=”White”>
        <Button Content=”WCF 调用” Height=”23″ HorizontalAlignment=”Left” Margin=”84,111,0,0″ Name=”btnCallWCF” VerticalAlignment=”Top” Width=”75″ Click=”btnCallWCF_Click” />
        <TextBox Height=”23″ HorizontalAlignment=”Left” Margin=”84,71,0,0″ Name=”txtName” VerticalAlignment=”Top” Width=”120″ />
        <TextBlock Height=”23″ HorizontalAlignment=”Left” Margin=”228,71,0,0″ Name=”tbMsg” Text=”显示的内容” VerticalAlignment=”Top” />
    </Grid>

 

后台代码调用也大抵一个样了:

起名 13起名 14

private void btnCallWCF_Click(object sender, RoutedEventArgs e)
        {
            Binding binding = new BasicHttpBinding();
            EndpointAddress endPoint = new EndpointAddress(“http://localhost:54321/Service.svc”);
            WorldService.ServiceClient client = new WorldService.ServiceClient(binding, endPoint);
            client.GetWorldCompleted += new EventHandler<WorldService.GetWorldCompletedEventArgs>(client_GetWorldCompleted);
            client.GetWorldAsync(int.Parse(txtName.Text));
        }

        void client_GetWorldCompleted(object sender, WorldService.GetWorldCompletedEventArgs e)
        {
            WorldService.MyWorld world = e.Result;
            if (world != null)
            {
                tbMsg.Text = world.Name;
            }
            else
            {
                tbMsg.Text = “返回为NULL”;
            }

        }

 

上一节认证了每行代码的意,这节即不又了。

可是生一个e.Result参数,会依据你道的回值不同,而返的门类是见仁见智之。所以这边的e.Result就是MyWorld类型,不是上节的string类型了。

全按照正式代码写了,按F5,运行

起名 15

输入数字1:[服务端直接吃污染数字的,你别瞎刻画其它]

回车调用,啊,出现异常:

起名 16

关押一下,跨域的错算是出来了。

俺们因而Firefox跟踪一下调用,看截图大伙看:

起名 17

看到莫,有三三两两独404搜索不至文件之,按法定的布道简单即是:

只要碰到跨域情况,会优先物色第一独布局文件:clientaccesspolicy.xml

如若找不交,就去搜寻第二单布局文件:crossdomain.xml

故而,新加一个clientaccesspolicy.xml文件就可以了,第二单布局文件是足以毫不的,因为找到后她便非摸第二独了。

咱俩对正值WorldService的WCF服务应用程序右键,添加文件->xml文件:

起名 18

确定后,xml的情吧:

起名 19起名 20

<?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>

 

 

保留后,我们重新运行F5,还是输入1:

回车调用:

起名 21

一切正常了。跨域的题目不怕一个布置文件解决了。

OK,这节暨之矣,下节我们简要说出口双工通讯

供源码下载:点击下载

 

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图