问题描述

我将一个在本地调试正常的service部署到服务器后遇到了添加服务引用失败的问题。
在把配置文件中基址使用的localhost替换成服务器的ip地址后问题得到了解决。
但我感觉这并不是一个因为粗心写错地址产生的问题,真正的原因可能没有这么简单。

分析

在添加服务引用时需要填写服务的元数据地址,然后点Go按钮。
它出错的时候可能是这个样子:


也可能是这个样子:


我们来研究一下它们为什么失败了。
在浏览器中打开对应的地址可以看到:

还有


页面上有些链接的地址是基于localhost的,也就是配置文件里设的基址。
前面的错误提示也主要集中在无法获取到localhost上的数据,而这些数据按理说应该是从服务器来获取的。
这就是问题的原因——由HTTP-GET自动生成的元数据使用了配置里服务的基址。
所以当我把配置文件中基址使用的localhost替换成服务器的ip地址后问题就解决了。

解决方案

虽然在基址中直接使用ip的方法是有效的,但是,很别扭,对吧。
因为我们可能通过ip、主机名、域名等很多种方式访问服务,而且服务可能是部署在内网的一台主机上。
这么多复杂的情况我们该怎么办呢?
其实WCF已经为我们想好了,只要在配置中打开<useRequestHeadersForMetadataAddress>开关,来:
Enables the retrieval of metadata address information from the request message headers.

  1. <behaviors>
  2. <serviceBehaviors>
  3. <behavior>
  4. <serviceMetadata httpGetEnabled="true" />
  5. <useRequestHeadersForMetadataAddress />
  6. </behavior>
  7. </serviceBehaviors>
  8. </behaviors>

参考

http://stackoverflow.com/questions/5007270/how-to-change-wsdl-url-from-internal-machine-name-to-public
http://zamd.net/wcf/2010/01/14/using-request-headers-for-metadata-address.html
https://msdn.microsoft.com/en-us/library/ee816894(v=vs.110).aspx

Using Request Headers for Metadata Address的更多相关文章

  1. 不要直接对Request.Headers["If-Modified-Since"]使用Convert.ToDateTime

    不要直接对Request.Headers["If-Modified-Since"]使用Convert.ToDateTime 前一段时间图片处理服务一直报“System.Format ...

  2. Retrofit2.0+OkHttp设置统一的请求头(request headers)

    有时候要求Retrofit2的接口中每个都要增加上headers,又不想做重复的事情,可以使用这种方法来为每个request请求都设置上相同的请求头header. 修改请求头request heade ...

  3. HTTP响应头信息(Response Headers)与请求头信息(Request Headers)

    打开了电影天堂网站,我们鼠标右键“检查”->打开“开发者工具”->选择“Network”. 刷新网页,选择某一文件点击(此处我是点击db.css),可以观察到Response Header ...

  4. 请求头(request headers)和响应头(response headers)解析

    *****************请求头(request headers)***************** POST /user/signin HTTP/1.1    --请求方式 文件名 http ...

  5. 问题:request.Headers;结果:HttpWebRequest.Headers 属性

    指定构成 HTTP 标头的名称/值对的集合. Headers 集合包含与请求关联的协议标头.下表列出了由系统或由属性或方法设置但未存储在 Headers 中的 HTTP 标头.   标头 设置方 Ac ...

  6. .NET Core 中读取 Request.Headers 的姿势

    Request.Headers 的类型是 IHeaderDictionary 接口,对应的实现类是 HeaderDictionary ,C# 实现源码见 HeaderDictionary.cs . H ...

  7. 直接复制浏览器Request headers中的进行copyheaders进行转换

    先导入函数库 from copyheaders import headers_raw_to_dict 然后复制请求头 headers = b'''accept: application/json, t ...

  8. HTTP请求协议中请求报文(Request Headers)跟响应报文(Response Headers)的简单理解

    背景 今儿个一新来的应届生问我,开发模式中所看到的web请求的请求头里的属性怎么理解,我便根据自己的经验随便拉开一个请求跟他聊了起来,顺便自己记录下文字版,以后再有交流直接发地址给他就好了,嘻嘻,机智 ...

  9. Python 接口之request ,headers格式不对

    复制heardes格式,模拟请求报错 原因:粗心,headers带了空格

随机推荐

  1. H5 继承

    继承 CSS的某些样式是具有继承性的,那么什么是继承呢?继承是一种规则,它允许样式不仅应用于某个特定html标签元素,而且应用于其后代.比如下面代码:如某种颜色应用于p标签,这个颜色设置不仅应用p标签 ...

  2. JavaScript中的一些小技巧

    js 数字操作:1.1 取整:取整有很多方法如: parseInt(a,10); Math.floor(a); a>>0; ~~a; a|0; 前面2种是经常用到的,后面3种算是比较偏的, ...

  3. 27-水池数目(dfs)

    水池数目 时间限制:3000 ms  |  内存限制:65535 KB 难度:4   描述 南阳理工学院校园里有一些小河和一些湖泊,现在,我们把它们通一看成水池,假设有一张我们学校的某处的地图,这个地 ...

  4. Windows ---- mysql 5.7 配置安装

    去官网下载mysql 下载地址    https://dev.mysql.com/downloads/mysql/    根据自己操作系统位数选择相对应的版本 点击Download下载 下载下来后是一 ...

  5. 线上服务内存OOM问题定位

    转自:架构师之路,http://mp.weixin.qq.com/s/iOC1fiKDItn3QY5abWIelg 相信大家都有感触,线上服务内存OOM的问题,是最难定位的问题,不过归根结底,最常见的 ...

  6. BOOST_TYPEOF和BOOST_AUTO

    1.简介 头文件<boost/typeof.hpp>里定义了两个宏:BOOST_TYPEOF和BOOST_AUTO,分别用于仿真C++新标准的typeof和auto关键字,可以在编译期自动 ...

  7. jquery UI datepicker汉化

    由于近期工作需要,jquery ui的datepicker需要汉化,特此把代码贴在这$(function() { $.datepicker.regional["zh-CN"] = ...

  8. springdata -----操作ES

    一:配置springdata-Es elasticseach-JPA.xml <?xml version="1.0" encoding="UTF-8"?& ...

  9. php eval

    // Our PHP code inside a variable $phpCode = ' class Foo { private $name; public function __construc ...

  10. smarty中用truncate来截取中英文字符串及避免中文乱码问题

    smarty中用truncate来截取含有中英文的字符串,可能会出现中文乱码问题.字符串截取长度不一问题,下面是新建个扩展函数,或修改原Truncate函数方法也可以的.扩展smarty/plugin ...