WCF, не используя имя компьютера вместо доменного имени при просмотре MyService.svc? wsdl

Мой ответ состоит из двух частей. Часть 1 является математикой - чтобы дать ясность всем читателям потока и сделать понятным следующий код R. Часть 2 - программирование на R.

Часть 1 - Математика

Точечное произведение двух векторов x и y можно определить как:

enter image description here

где || x || является евклидовой нормой (также известной как норма L 2 ) вектора x .

Управляя определением точечного произведения, мы можем получить:

enter image description here

где тета - угол между векторами x и y выражено в радианах. Обратите внимание, что тета может принимать значение, лежащее на отрезке от 0 до pi.

Решая для самой тета, мы получаем:

enter image description here

Часть 2 - R-код

Чтобы перевести математику в R-код, нам нужно уметь выполнять два матричных (векторных) вычисления; скалярное произведение и евклидова норма (которая является специфическим типом нормы, известной как норма L 2 ). Нам также нужно знать R-эквивалент обратной косинус-функции, cos -1 .

Начиная сверху. Ссылаясь на ?"%*%", скалярное произведение (также называемое внутренним произведением) может быть вычислено с использованием оператора %*%. Со ссылкой на ?norm функция norm() (базовый пакет) возвращает a норму вектора. Здесь интересующей нормой является норма L 2 или, на языке справочной документации R, «спектральная» или «2» -норма. Это означает, что аргумент type функции norm() должен быть установлен равным "2". Наконец, функция обратного косинуса в R представлена ​​функцией acos().

Решение

Оборудованный как математикой, так и соответствующими функциями R, можно создать функцию-прототип (то есть не производственный стандарт) - используя функции базового пакета - как показано ниже. Если приведенная выше информация имеет смысл, то последующая функция angle() должна быть понятной без дальнейших комментариев.

angle <- function(x,y){
  dot.prod <- x%*%y 
  norm.x <- norm(x,type="2")
  norm.y <- norm(y,type="2")
  theta <- acos(dot.prod / (norm.x * norm.y))
  as.numeric(theta)
}

Проверка функции

Проверка, чтобы убедиться, что функция работает. Пусть x = (2,1) и y = (1,2). Продукт точек между x и y равен 4. Евклидова норма x равна sqrt (5). Евклидова норма y также является квадратом (5). cos theta = 4/5. Тета составляет примерно 0,643 радиана.

x <- as.matrix(c(2,1))
y <- as.matrix(c(1,2))
angle(t(x),y)          # Use of transpose to make vectors (matrices) conformable.
[1] 0.6435011

Надеюсь, это поможет!

32
задан Jeroen 29 April 2014 в 11:31
поделиться

5 ответов

Мы используем WCFExtras для изменения имени хоста.

WCFExtras - это небольшая библиотека с открытым исходным кодом, которая позволит вам написать следующее для изменения имени хоста:

<behaviors>
  <endpointBehaviors>
    <behavior name="xxx">
      <wsdlExtensions location="http://some-hostname-visible-from-outside/path-to-a-service/service.svc" singleFile="True" />
    </behavior>
  ...
3
ответ дан 27 November 2019 в 20:38
поделиться

Для IIS7 вы не добавляете его в web.config, а в файл конфигурации IIS.

Прежде всего, отредактируйте привязки вашего веб-сайта, чтобы протокол HTTP указывал имя хоста, если вы еще этого не сделали - это обеспечит получение правильного имени в HTTP.

Перейдите в C: \ Windows \ System32 \ inetsrv \ config и откройте applicationHost.config

Найдите раздел сайтов. Вы увидите что-то вроде следующего

<sites>
  <site name="Default Web Site" id="1">
    <application path="/">
        <virtualDirectory path="/" physicalPath="%SystemDrive%\inetpub\wwwroot" />
    </application>
    <bindings>
      <binding protocol="http" bindingInformation="*:80:puck" />
      <binding protocol="net.tcp" bindingInformation="808:*" />
      <binding protocol="net.pipe" bindingInformation="*" />
      <binding protocol="net.msmq" bindingInformation="localhost" />
      <binding protocol="msmq.formatname" bindingInformation="localhost" />
      <binding protocol="http" bindingInformation="*:80:puck.idunno.org" />
      <binding protocol="http" bindingInformation="*:80:localhost" />
      <binding protocol="https" bindingInformation="*:443:" />
    </bindings>
  </site>
  ....
</sites>

. Вы можете видеть, что привязки для протокола http определяют заголовок хоста, а https - нет. Когда вы просматриваете веб-страницы, вы не можете использовать заголовки хоста через HTTPS, но WCF по-прежнему использует их при генерации WSDL - если он не может найти его, он вернется к имени компьютера.

Итак, все, что вам нужно сделать, это отредактировать привязку HTTPS следующим образом

      <binding protocol="https" bindingInformation="*:443:puck" />

, добавив правильное полное доменное имя в конец информации привязки. Сбросьте IIS и WCF должны получить его прямо сейчас.

Решение IIS6 уже было опубликовано darin

9
ответ дан 27 November 2019 в 20:38
поделиться

Этот пост решил эту проблему для меня. Мне нужно было связать мое доменное имя с моим IP-адресом и веб-сайтом в IIS.

http://www.codemeit.com/wcf/wcf-wsdl-xsdimport-schemalocations-link-to-local-machine-name-not-domain-name- while-hosted-in-iis.html

0
ответ дан 27 November 2019 в 20:38
поделиться

Я добавил решения здесь, http://knowledgebaseworld.blogspot.com/2010/ 06 / имя-домена-заменено-имя-машины.html . он должен работать для вас всех, так как он отлично работает со мной на локальном, промежуточном и производственном уровнях без привязки к iis

1
ответ дан 27 November 2019 в 20:38
поделиться

Ни одно из этих решений не помогло мне. Я смог решить эту проблему с помощью очень простой Custom Service Factory.

Установка службы WCF на общий хостинг-сайт, повторное посещение

1
ответ дан 27 November 2019 в 20:38
поделиться
Другие вопросы по тегам:

Похожие вопросы: