как изменить url wsdl с внутреннего имени машины на публичное?

<p>у меня есть простой сервис, который я развернул в azure. это доступно через:</p><pre><code>http://xxxxxxxxxxxxxxxxxxxxxxx.cloudapp.net/mytestservice.svc </code></pre><p>url-адрес wsdl использует имя внутреннего компьютера вместо общедоступного dns:</p><pre><code>svcutil.exe http://rd001520d328923a/mytestservice.svc?wsdl </code></pre><p>очевидно, что wsdl не доступен извне машины с этим.</p><p>мне известно о нескольких вещах, которые можно изменить, если вы запускаете это в iis или знаете url-адрес службы. например, изменив конфигурацию <code><servicemetadata></code>, указав свойство <code>httpgeturl</code>, но это не сработает, так как мне придется включить абсолютный url. используя относительный url, он по-прежнему использует внутреннее имя компьютера. реальная проблема заключается в том, что wsdl включает url-ссылки с именем компьютера, поэтому делает его бесполезным.</p><p>есть два некачественных обходных пути:</p><ul> <li><p>было предложено, чтобы я мог получить wsdl, отредактировать его, чтобы исправить url-адреса, а затем загрузить его, чтобы он был доступен с другого url-адреса. </p></li> <li><p>я обнаружил, что исправление с начала 2010 года было доступно, но должен быть лучший способ.</p></li> </ul><p>как можно решить эту проблему, чтобы использовать общедоступный dns вместо имени компьютера?</p>

<p>хорошо. я смотрю на это почти неделю. я наконец нашел ответ, так как он не легко доступен, я надеюсь, что он будет проиндексирован и сэкономит время для других.</p><p>в основном это общее поведение как известная проблема с wcf 3.0/3.5, для которой они выпустили исправление. вы можете узнать больше здесь: <a href="http://support.microsoft.com/kb/971842">исправление: uri в документе wcf wsf ссылаются на недоступные внутренние экземпляры, а не на балансировщик нагрузки ...</a> </p><p>я сталкивался с этим несколько раз в ходе своего исследования, но никогда не думал об этом, в основном потому, что не знал, как развернуть исправление в azure. </p><p>к счастью, модератор microsoft на форумах msdn отметил, что это было исправлено в .net 4.0. это означало, что «исправление», рекомендованное в статье базы знаний выше, все еще применялось, за исключением того, что исправление применять не нужно. так в чем же решение? просто добавьте следующее в файл конфигурации:</p><pre><code><servicebehaviors> <behavior name="<name>"> <!-- other options would go here --> <userequestheadersformetadataaddress> <defaultports> <!-- use your own port numbers --> <add scheme="http" port="81" /> <add scheme="https" port="444" /> </defaultports> </userequestheadersformetadataaddress> </behavior> </servicebehaviors> </code></pre><p>и это все…. это было бы намного проще, если бы было яснее, что эта проблема теперь исправлена. возможно, я не выглядел достаточно сложно.</p>

<p>сообщение в блоге <a href="http://zamd.net/2010/01/14/using-request-headers-for-metadata-address/">использование заголовков запроса для адреса метаданных</a> похоже на<br> <a href="https://stackoverflow.com/users/42518/victor">victor</a> 's <a href="https://stackoverflow.com/a/5017603/52277">answer</a> , но объясняет, что порты по умолчанию являются необязательными и могут быть опущены:</p><pre><code><system.servicemodel> <behaviors> <servicebehaviors> <behavior> <userequestheadersformetadataaddress/> </behavior> </servicebehaviors> </behaviors> </system.servicemodel> </code></pre><p>также показано, как включить поведение в коде.</p><pre><code>sh.description.behaviors.add(new userequestheadersformetadataaddressbehavior()); </code></pre>

<p>вы генерируете wsdl, чтобы опубликовать его, или вы просто пытаетесь добавить ссылку в другой проект?</p><p>если это позднее, я предлагаю использовать подход wcf channelfactory, а не «добавить ссылку на сервис». я считаю, что это дает мне более последовательные контролируемые результаты.</p><p> <a href="http://msdn.microsoft.com/en-us/library/ms734681.aspx">http://msdn.microsoft.com/en-us/library/ms734681.aspx</a> </p><p>я должен добавить, я не пробовал это на azure.</p>