2013-08-13 3 views
2

Цель: мне нужно отправить серию отчетов об испытаниях из группы автоматизированных серверов в базу данных. Сценарии тестирования находятся на питоне, а не открываются, что может червей. Я хочу настроить сценарий Powershell, чтобы выполнить завершенные тесты в службе WCF.Как Powershell может использовать службу REST службы WCF через IIS?

У меня есть существующий веб-сайт ASP.NET, который управляет отчетами и строит из него, я хотел бы добавить простую службу WCF, доступ к которой можно получить через автоматизацию. Кажется, я бегу в стены, и чувствую, что я очень близок к тому, чтобы это работало. Я работаю над этой проблемой в течение нескольких дней, и мои глаза начинают кровоточить, читая веб-сайты, пытаясь найти соответствующую помощь.

Service Code:

namespace TrendDB.Web 
{ 
    [ServiceContract] 
    public interface ITrendRestService 
    { 
     [OperationContract] 
     [WebGet] 
     string GetTestMessage(); 
    } 

    [AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)] 
    public class TrendRestService : ITrendRestService 
    { 
     public string GetTestMessage() 
     { 
      return "Success!"; 
     } 
    } 
} 

Web.config (только уместна информация показана):

<system.web> 
... 
    <authentication mode="Windows" /> 
    <authorization> 
    <deny users="?" /> 
    </authorization> 
... 
</system.web> 
... 
<system.serviceModel> 
    <behaviors> 
    <serviceBehaviors> 
     <behavior name=""> 
     <serviceMetadata httpGetEnabled="true" httpsGetEnabled="true" /> 
     <serviceDebug includeExceptionDetailInFaults="false" /> 
     </behavior> 
    </serviceBehaviors> 
    <endpointBehaviors> 
     <behavior name="restfulBehavior"> 
     <webHttp/> 
     </behavior> 
    </endpointBehaviors> 
    </behaviors> 
    <serviceHostingEnvironment aspNetCompatibilityEnabled="true" multipleSiteBindingsEnabled="true" /> 
    <services> 
    <service name="TrendDB.Web.TrendRestService"> 
     <endpoint address="" behaviorConfiguration="restfulBehavior" 
       binding="webHttpBinding" bindingConfiguration="" contract="TrendDB.Web.ITrendRestService"> 
     </endpoint> 
    </service> 
    </services> 
</system.serviceModel> 

Я испытал это, как работает в моем браузере, как http://localhost/trenddb/TrendRestService.svc/GetTestMessage и сообщение, которое пришло через было:

<string xmlns="http://schemas.microsoft.com/2003/10/Serialization/">Success!</string> 

IIS 7.5 был создан с использованием BKM из MS для использования MVC роли authoriza для интрасети. На сайте установлен определенный пул приложений, а сервер настроен в домене с использованием проверки подлинности Windows.

Мои первые звонки в Powershell начал как:

$trend = New-WebServiceProxy -uri http://localhost/trenddb/TrendRestService.svc 

New-WebServiceProxy : The request failed with HTTP status 401: Unauthorized. 

Это хорошо, так как по крайней мере, это консервированный ответ на анонимный доступ, поэтому я добавил -UseDefaultCredential в команду и получил:

$trend = New-WebServiceProxy -uri http://localhost/trenddb/TrendRestService.svc -UseDefaultCredential 
New-WebServiceProxy : Object reference not set to an instance of an object. 

Я попытался с помощью GetTestMessage WebInvoke просто чтобы посмотреть, что случилось:

$trend = New-WebServiceProxy -uri http://localhost/trenddb/TrendRestService.svc/GetTestMessage -UseDefaultCredential 
New-WebServiceProxy : The document at the url 
http://localhost/trenddb/TrendRestService.svc/GetTestMessage was not recognized as a known document type. 
The error message from each known type may help you fix the problem: 
- Report from 'WSDL Document' is 'There is an error in XML document (1, 2).'. 
    - <string xmlns='http://schemas.microsoft.com/2003/10/Serialization/'> was not expected. 
- Report from 'XML Schema' is 'The root element of a W3C XML Schema should be <schema> and its namespace should be 'http://www.w3.org/2001/XMLSchema'.'. 
- Report from 'DISCO Document' is 'Discovery document at the URL http://localhost/trenddb/TrendRestService.svc/GetTestMessage could not be found.'. 
    - The document format is not recognized. 

Из моего браузера звоните в WCF. Я знаю, что <string xmlns='http://schemas.microsoft.com/2003/10/Serialization/'> был именно тем, чего я ожидаю ... поэтому теперь мне нужно выяснить, что требуется для подключения к этой службе WCF REST.

Редактировать: Использование утилиты svcutil.exe создает прокси-сервер, но пропускает файл конфигурации. Ли строка serviceMetadata httpGetEnabled="true" означает, что я создаю метаданные, используемые для клиента WCF? Будет ли этот эффект PS?

+0

Просто проверьте, что вы не используете консоль PS в качестве администратора, не так ли? Интересно, вызывает ли это 'DefaultCredential'. –

+0

Захват запроса, сделанного из вашего веб-браузера с помощью Fiddler, а затем аналогичным образом захватить запрос от PS и сравнить их, чтобы узнать, какая разница существует, что вызывает проблему. – Rajesh

+0

@SrikanthVenugopalan - Я не запускаю его как Admin, я попробовал его снова как Admin и те же сообщения/поведение. –

ответ

9

New-WebServiceProxy создает прокси-сервер «веб-службы» для веб-сервисов (таких как .asmx в .NET). Такими услугами являются сервисы WS-I-Basic Profile 1.1. Другими словами, есть ожидание WSDL.

Служба WCF имеет только одну конечную точку, которая является конечной точкой WebHttpBinding. Такая конечная точка используется для HTTP-клиентов (без мыла) и обычно используется клиентами REST, потому что они используют только протоколы Интернета (HTTP и соответствующие глаголы такие GET, POST, ...). Когда вы протестировали это с помощью своего браузера, это сработало, потому что браузеры - это только HTTP-клиенты. Когда вы протестировали его с помощью прокси-сервера из New-WebServiceProxy, он пытается интерпретировать ответ как WSDL, а не просто строку, потому что это тот тип, который создает New-WebServiceProxy.

Для того, чтобы службы WCF работу для Web Service клиентов (например, Нью-WebServiceProxy), вам нужно добавить еще одну конечную точку для тех клиентов, с использованием привязки они понимают, что это BasicHttpBinding.

 <endpoint address="basic" binding="basicHttpBinding" contract="TrendDB.Web.ITrendRestService" /> 

Это, по крайней мере, будет работать для двух типов клиентов (минус безопасность).

Для обеспечения безопасности создайте BindingConfiguration для basicHttpBinding и один для webHttpBinding. Там вы можете указать тип учетных данных клиента как Windows.

+0

Хороший ответ, Рик. Грег, возможно, не оценил это, но я знаю. – Brian

+2

@Brian: Насколько «Грег, возможно, не оценил это», я предполагаю, что вы имели в виду, что я не могу полностью оценить то, что предоставил Рик, но это невежество с моей стороны, что я участвую в преодолении, а не отсутствие благодарности ответ. Я думаю, что это решение именно то, что мне нужно. У меня не было достаточно времени, чтобы вернуться к реализации этого и потребовалось время для работы с этим, прежде чем я задал любые вопросы или предоставил ответ. –

Смежные вопросы