Ho fatto così:
Ho spostato la procedura per decidere la restituzione in formato JSON di default sul Proxy ch richiamerà le rest API anziché implementarla nel contoller del Rest service.
L'ho implementata così:
nel Proxy definisco due proprietà, una per il segmento di URI comune a tutte le api ("/api/NomeController") e una per il client, che userà la precedente per impostarsi il BaseAddrss.
private string _webApiEndopoint;
private HttpClient _client;
Il segmento di URI/endpoint comune l'ho definito nel app.Config, dentro il tag <configuration>
<commonEndpointSegment value="/api/Movie" />
Nel costruttore del proxy inizializzo quindi il client: A _webApiEndopoint assegno il segmento di endopoint comune ("/Api/NomeController"), usando ConfigurationManager per inizializzare la stringa e recuperare il valore dell'endpoint. Dopodiché inizialitzzo il client, che avrà come BaseAddres il precedente valore, al quale aggiunge il segmento successivo dell'URI (diverso per ogni API esposta dal rest service) -->
public RestProxy ( )
{
_webApiEndopoint = ConfigurationManager.GetSection("commonEndpointSegment").ToString();
_client = new HttpClient();
_client.BaseAddress = new Uri(_webApiEndopoint) ; // endpoint a cui punta client
}
Dopodiché ho definito un metodo che prende in input una response di tipo HttpRespnseMessage e restituisce il risultato convertito in JSon:
T GetResult<T>(HttpResponseMessage response)
{
var content = response.Content.ReadAsStringAsync().Result;
return JsonConvert.DeserializeObject<T>(content);
}
Questo metodo lo richiamo all'interno dei metodi che richiamano le operazioni esposte dalla web API , ad es.:
public int InsertMovie(Movie movie)
{
HttpResponseMessage response = _client.PostAsJsonAsync<Movie>("AddMovie", movie).Result;
return GetResult<int>(response);
}
Quando invece il metodo prende in input più di un parametro, al suo interno inizializzo una variabile della classe MovieController per restituire l'oggetto, e poi passo quella variabile in input in PostAsJsonAsync(), ad es.:
public List<Movie> GetMovieByProperties(string title, int year)
{
var _movieController = new MovieController(); // controller del RestService che espone le operazioni
List<Movie> returnedDvdOfMovie = _movieController .GetMovieByProperties(title, year);
HttpResponseMessage response = _client.PostAsJsonAsync<List<Movie>>("SearchMovie", returnedDvdOfMovie ).Result;
return GetResult<List<Movie>>(response);
}
Nell'app.config del Proxy ho anche aggiunto questo indirizzo endpoint sotto il tag <client> :
<endpoint address="http://localhost/RESTService/MovieController.cs" binding="basicHttpBinding" />
Credo innanzitutto di aver sbagliato la modifica nell'app.config, perché quando testo uno dei metodi del proxy ottengo errore
"Configuration system failed to initialize"
...
Poi mi chiedevo se ho fatto bene a inizializzare il controller all'interno di alcuni metodi per poter usare PostAsJsonAsync, o se dovrei evitarlo usando qualche altro metodo di tipo httpClient che mi permetta di passare in input tutti i parametri desiderati